aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine
diff options
context:
space:
mode:
authorubit2012-07-17 02:07:21 +0200
committerubit2012-07-17 02:07:21 +0200
commite925b0654d12c534ff9f837355ad43483dbd22cb (patch)
treee8a05e918e55ec8034dd724c38f143aac31493b2 /OpenSim/Region/ScriptEngine
parentMerge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork (diff)
parentMerge branch 'avination' into ubitwork (diff)
downloadopensim-SC-e925b0654d12c534ff9f837355ad43483dbd22cb.zip
opensim-SC-e925b0654d12c534ff9f837355ad43483dbd22cb.tar.gz
opensim-SC-e925b0654d12c534ff9f837355ad43483dbd22cb.tar.bz2
opensim-SC-e925b0654d12c534ff9f837355ad43483dbd22cb.tar.xz
Merge branch 'ubitwork' of ssh://3dhosting.de/var/git/careminster into ubitwork
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs19
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs41
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs15
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs1412
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs12
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs12
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs439
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs25
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs7
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs42
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs35
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs54
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs50
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs11
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs142
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs9
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs24
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs231
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs20
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs385
27 files changed, 1820 insertions, 1221 deletions
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs
index bb5bacc..2027ca6 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs
@@ -27,17 +27,22 @@
27 27
28using System; 28using System;
29using OpenMetaverse; 29using OpenMetaverse;
30using OpenSim.Framework;
30using OpenSim.Region.Framework.Scenes; 31using OpenSim.Region.Framework.Scenes;
31 32
32
33namespace OpenSim.Region.ScriptEngine.Interfaces 33namespace OpenSim.Region.ScriptEngine.Interfaces
34{ 34{
35 public interface IScriptApi 35 public interface IScriptApi
36 { 36 {
37 // 37 /// <summary>
38 // Each API has an identifier, which is used to load the 38 /// Initialize the API
39 // proper runtime assembly at load time. 39 /// </summary>
40 // 40 /// <remarks>
41 void Initialize(IScriptEngine engine, SceneObjectPart part, uint localID, UUID item); 41 /// Each API has an identifier, which is used to load the
42 /// proper runtime assembly at load time.
43 /// <param name='engine'>/param>
44 /// <param name='part'></param>
45 /// <param name='item'></param>
46 void Initialize(IScriptEngine engine, SceneObjectPart part, TaskInventoryItem item);
42 } 47 }
43} 48} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index b04f6b6..ec13b6c 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -64,6 +64,16 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
64 bool Running { get; set; } 64 bool Running { get; set; }
65 65
66 /// <summary> 66 /// <summary>
67 /// Gets or sets a value indicating whether this
68 /// <see cref="OpenSim.Region.ScriptEngine.Interfaces.IScriptInstance"/> is run.
69 /// For viewer script editor control
70 /// </summary>
71 /// <value>
72 /// <c>true</c> if run; otherwise, <c>false</c>.
73 /// </value>
74 bool Run { get; set; }
75
76 /// <summary>
67 /// Is the script suspended? 77 /// Is the script suspended?
68 /// </summary> 78 /// </summary>
69 bool Suspended { get; set; } 79 bool Suspended { get; set; }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs
index 47ed6ba..684138f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs
@@ -29,42 +29,43 @@ using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Reflection; 31using System.Reflection;
32using log4net;
32using OpenSim.Region.ScriptEngine.Interfaces; 33using OpenSim.Region.ScriptEngine.Interfaces;
33 34
34namespace OpenSim.Region.ScriptEngine.Shared.Api 35namespace OpenSim.Region.ScriptEngine.Shared.Api
35{ 36{
36 public class ApiManager 37 public class ApiManager
37 { 38 {
39// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
40
38 private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>(); 41 private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>();
39 42
40 public string[] GetApis() 43 public string[] GetApis()
41 { 44 {
42 if (m_Apis.Count > 0) 45 if (m_Apis.Count <= 0)
43 { 46 {
44 List<string> l = new List<string>(m_Apis.Keys); 47 Assembly a = Assembly.GetExecutingAssembly();
45 return l.ToArray();
46 }
47 48
48 Assembly a = Assembly.GetExecutingAssembly(); 49 Type[] types = a.GetExportedTypes();
49 50
50 Type[] types = a.GetExportedTypes(); 51 foreach (Type t in types)
51
52 foreach (Type t in types)
53 {
54 string name = t.ToString();
55 int idx = name.LastIndexOf('.');
56 if (idx != -1)
57 name = name.Substring(idx+1);
58
59 if (name.EndsWith("_Api"))
60 { 52 {
61 name = name.Substring(0, name.Length - 4); 53 string name = t.ToString();
62 m_Apis[name] = t; 54 int idx = name.LastIndexOf('.');
55 if (idx != -1)
56 name = name.Substring(idx+1);
57
58 if (name.EndsWith("_Api"))
59 {
60 name = name.Substring(0, name.Length - 4);
61 m_Apis[name] = t;
62 }
63 } 63 }
64 } 64 }
65 65
66 List<string> ret = new List<string>(m_Apis.Keys); 66// m_log.DebugFormat("[API MANAGER]: Found {0} apis", m_Apis.Keys.Count);
67 return ret.ToArray(); 67
68 return new List<string>(m_Apis.Keys).ToArray();
68 } 69 }
69 70
70 public IScriptApi CreateApi(string api) 71 public IScriptApi CreateApi(string api)
@@ -76,4 +77,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
76 return ret; 77 return ret;
77 } 78 }
78 } 79 }
79} 80} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
index 3cbdde5..693992a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs
@@ -233,17 +233,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
233 m_Timer[engine].UnSetTimerEvents(localID, itemID); 233 m_Timer[engine].UnSetTimerEvents(localID, itemID);
234 234
235 // Remove from: HttpRequest 235 // Remove from: HttpRequest
236 IHttpRequestModule iHttpReq = 236 IHttpRequestModule iHttpReq = engine.World.RequestModuleInterface<IHttpRequestModule>();
237 engine.World.RequestModuleInterface<IHttpRequestModule>(); 237 if (iHttpReq != null)
238 iHttpReq.StopHttpRequest(localID, itemID); 238 iHttpReq.StopHttpRequest(localID, itemID);
239 239
240 IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>(); 240 IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>();
241 if (comms != null) 241 if (comms != null)
242 comms.DeleteListener(itemID); 242 comms.DeleteListener(itemID);
243 243
244 IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>(); 244 IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>();
245 xmlrpc.DeleteChannels(itemID); 245 if (xmlrpc != null)
246 xmlrpc.CancelSRDRequests(itemID); 246 {
247 xmlrpc.DeleteChannels(itemID);
248 xmlrpc.CancelSRDRequests(itemID);
249 }
247 250
248 // Remove Sensors 251 // Remove Sensors
249 m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID); 252 m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID);
@@ -325,7 +328,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
325 { 328 {
326 List<Object> data = new List<Object>(); 329 List<Object> data = new List<Object>();
327 330
328 Object[] listeners=m_Listener[engine].GetSerializationData(itemID); 331 Object[] listeners = m_Listener[engine].GetSerializationData(itemID);
329 if (listeners.Length > 0) 332 if (listeners.Length > 0)
330 { 333 {
331 data.Add("listener"); 334 data.Add("listener");
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
index 489c1c6..b5fa6de 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -59,16 +59,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
59 { 59 {
60 internal IScriptEngine m_ScriptEngine; 60 internal IScriptEngine m_ScriptEngine;
61 internal SceneObjectPart m_host; 61 internal SceneObjectPart m_host;
62 internal uint m_localID; 62 internal TaskInventoryItem m_item;
63 internal UUID m_itemID;
64 internal bool m_CMFunctionsEnabled = false; 63 internal bool m_CMFunctionsEnabled = false;
65 64
66 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 65 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
67 { 66 {
68 m_ScriptEngine = ScriptEngine; 67 m_ScriptEngine = ScriptEngine;
69 m_host = host; 68 m_host = host;
70 m_localID = localID; 69 m_item = item;
71 m_itemID = itemID;
72 70
73 if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false)) 71 if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false))
74 m_CMFunctionsEnabled = true; 72 m_CMFunctionsEnabled = true;
@@ -95,7 +93,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
95 public string cmDetectedCountry(int number) 93 public string cmDetectedCountry(int number)
96 { 94 {
97 m_host.AddScriptLPS(1); 95 m_host.AddScriptLPS(1);
98 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 96 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
99 if (detectedParams == null) 97 if (detectedParams == null)
100 return String.Empty; 98 return String.Empty;
101 return detectedParams.Country; 99 return detectedParams.Country;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 595dd8a..6ec3081 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -88,8 +88,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
89 protected IScriptEngine m_ScriptEngine; 89 protected IScriptEngine m_ScriptEngine;
90 protected SceneObjectPart m_host; 90 protected SceneObjectPart m_host;
91 protected uint m_localID; 91
92 protected UUID m_itemID; 92 /// <summary>
93 /// The item that hosts this script
94 /// </summary>
95 protected TaskInventoryItem m_item;
96
93 protected bool throwErrorOnNotImplemented = true; 97 protected bool throwErrorOnNotImplemented = true;
94 protected AsyncCommandManager AsyncCommands = null; 98 protected AsyncCommandManager AsyncCommands = null;
95 protected float m_ScriptDelayFactor = 1.0f; 99 protected float m_ScriptDelayFactor = 1.0f;
@@ -107,6 +111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
107 protected IUrlModule m_UrlModule = null; 111 protected IUrlModule m_UrlModule = null;
108 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = 112 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache =
109 new Dictionary<UUID, UserInfoCacheEntry>(); 113 new Dictionary<UUID, UserInfoCacheEntry>();
114 protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp.
110 115
111// protected Timer m_ShoutSayTimer; 116// protected Timer m_ShoutSayTimer;
112 protected int m_SayShoutCount = 0; 117 protected int m_SayShoutCount = 0;
@@ -134,7 +139,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
134 {"TURNRIGHT", "Turning Right"} 139 {"TURNRIGHT", "Turning Right"}
135 }; 140 };
136 141
137 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 142 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
138 { 143 {
139/* 144/*
140 m_ShoutSayTimer = new Timer(1000); 145 m_ShoutSayTimer = new Timer(1000);
@@ -146,10 +151,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
146 151
147 m_ScriptEngine = ScriptEngine; 152 m_ScriptEngine = ScriptEngine;
148 m_host = host; 153 m_host = host;
149 m_localID = localID; 154 m_item = item;
150 m_itemID = itemID;
151 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 155 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
152 156
157 LoadLimits(); // read script limits from config.
158
159 m_TransferModule =
160 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>();
161 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
162
163 AsyncCommands = new AsyncCommandManager(ScriptEngine);
164 }
165
166 /* load configuration items that affect script, object and run-time behavior. */
167 private void LoadLimits()
168 {
153 m_ScriptDelayFactor = 169 m_ScriptDelayFactor =
154 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); 170 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f);
155 m_ScriptDistanceFactor = 171 m_ScriptDistanceFactor =
@@ -162,12 +178,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
162 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); 178 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255);
163 if (m_notecardLineReadCharsMax > 65535) 179 if (m_notecardLineReadCharsMax > 65535)
164 m_notecardLineReadCharsMax = 65535; 180 m_notecardLineReadCharsMax = 65535;
165 181 // load limits for particular subsystems.
166 m_TransferModule = 182 IConfig SMTPConfig;
167 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); 183 if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) {
168 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); 184 // there's an smtp config, so load in the snooze time.
169 185 EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME);
170 AsyncCommands = new AsyncCommandManager(ScriptEngine); 186 }
171 } 187 }
172 188
173 public override Object InitializeLifetimeService() 189 public override Object InitializeLifetimeService()
@@ -199,7 +215,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
199 [DebuggerNonUserCode] 215 [DebuggerNonUserCode]
200 public void state(string newState) 216 public void state(string newState)
201 { 217 {
202 m_ScriptEngine.SetState(m_itemID, newState); 218 m_ScriptEngine.SetState(m_item.ItemID, newState);
203 } 219 }
204 220
205 /// <summary> 221 /// <summary>
@@ -210,7 +226,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
210 public void llResetScript() 226 public void llResetScript()
211 { 227 {
212 m_host.AddScriptLPS(1); 228 m_host.AddScriptLPS(1);
213 m_ScriptEngine.ApiResetScript(m_itemID); 229 m_ScriptEngine.ApiResetScript(m_item.ItemID);
214 } 230 }
215 231
216 public void llResetOtherScript(string name) 232 public void llResetOtherScript(string name)
@@ -219,7 +235,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
219 235
220 m_host.AddScriptLPS(1); 236 m_host.AddScriptLPS(1);
221 237
222 if ((item = ScriptByName(name)) != UUID.Zero) 238 if ((item = GetScriptByName(name)) != UUID.Zero)
223 m_ScriptEngine.ResetScript(item); 239 m_ScriptEngine.ResetScript(item);
224 else 240 else
225 ShoutError("llResetOtherScript: script "+name+" not found"); 241 ShoutError("llResetOtherScript: script "+name+" not found");
@@ -231,7 +247,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
231 247
232 m_host.AddScriptLPS(1); 248 m_host.AddScriptLPS(1);
233 249
234 if ((item = ScriptByName(name)) != UUID.Zero) 250 if ((item = GetScriptByName(name)) != UUID.Zero)
235 { 251 {
236 return m_ScriptEngine.GetScriptState(item) ?1:0; 252 return m_ScriptEngine.GetScriptState(item) ?1:0;
237 } 253 }
@@ -253,7 +269,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
253 // These functions are supposed to be robust, 269 // These functions are supposed to be robust,
254 // so get the state one step at a time. 270 // so get the state one step at a time.
255 271
256 if ((item = ScriptByName(name)) != UUID.Zero) 272 if ((item = GetScriptByName(name)) != UUID.Zero)
257 { 273 {
258 m_ScriptEngine.SetScriptState(item, run == 0 ? false : true); 274 m_ScriptEngine.SetScriptState(item, run == 0 ? false : true);
259 } 275 }
@@ -362,77 +378,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
362 } 378 }
363 } 379 }
364 380
365 protected UUID InventorySelf()
366 {
367 UUID invItemID = new UUID();
368 bool unlock = false;
369 if (!m_host.TaskInventory.IsReadLockedByMe())
370 {
371 m_host.TaskInventory.LockItemsForRead(true);
372 unlock = true;
373 }
374 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
375 {
376 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
377 {
378 invItemID = inv.Key;
379 break;
380 }
381 }
382 if (unlock)
383 {
384 m_host.TaskInventory.LockItemsForRead(false);
385 }
386 return invItemID;
387 }
388
389 protected UUID InventoryKey(string name, int type) 381 protected UUID InventoryKey(string name, int type)
390 { 382 {
391 m_host.AddScriptLPS(1); 383 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
392 m_host.TaskInventory.LockItemsForRead(true);
393
394 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
395 {
396 if (inv.Value.Name == name)
397 {
398 m_host.TaskInventory.LockItemsForRead(false);
399
400 if (inv.Value.Type != type)
401 {
402 return UUID.Zero;
403 }
404
405 return inv.Value.AssetID;
406 }
407 }
408
409 m_host.TaskInventory.LockItemsForRead(false);
410 return UUID.Zero;
411 }
412
413 protected UUID InventoryKey(string name)
414 {
415 m_host.AddScriptLPS(1);
416
417
418 m_host.TaskInventory.LockItemsForRead(true);
419 384
420 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 385 if (item != null && item.Type == type)
421 { 386 return item.AssetID;
422 if (inv.Value.Name == name) 387 else
423 { 388 return UUID.Zero;
424 m_host.TaskInventory.LockItemsForRead(false);
425 return inv.Value.AssetID;
426 }
427 }
428
429 m_host.TaskInventory.LockItemsForRead(false);
430
431
432 return UUID.Zero;
433 } 389 }
434 390
435
436 /// <summary> 391 /// <summary>
437 /// accepts a valid UUID, -or- a name of an inventory item. 392 /// accepts a valid UUID, -or- a name of an inventory item.
438 /// Returns a valid UUID or UUID.Zero if key invalid and item not found 393 /// Returns a valid UUID or UUID.Zero if key invalid and item not found
@@ -442,19 +397,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
442 /// <returns></returns> 397 /// <returns></returns>
443 protected UUID KeyOrName(string k) 398 protected UUID KeyOrName(string k)
444 { 399 {
445 UUID key = UUID.Zero; 400 UUID key;
446 401
447 // if we can parse the string as a key, use it. 402 // if we can parse the string as a key, use it.
448 if (UUID.TryParse(k, out key))
449 {
450 return key;
451 }
452 // else try to locate the name in inventory of object. found returns key, 403 // else try to locate the name in inventory of object. found returns key,
453 // not found returns UUID.Zero which will translate to the default particle texture 404 // not found returns UUID.Zero
454 else 405 if (!UUID.TryParse(k, out key))
455 { 406 {
456 return InventoryKey(k); 407 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
408
409 if (item != null)
410 key = item.AssetID;
411 else
412 key = UUID.Zero;
457 } 413 }
414
415 return key;
458 } 416 }
459 417
460 // convert a LSL_Rotation to a Quaternion 418 // convert a LSL_Rotation to a Quaternion
@@ -559,15 +517,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
559 return LSL_Vector.Norm(v); 517 return LSL_Vector.Norm(v);
560 } 518 }
561 519
562 public LSL_Float llVecDist(LSL_Vector a, LSL_Vector b) 520 private double VecDist(LSL_Vector a, LSL_Vector b)
563 { 521 {
564 m_host.AddScriptLPS(1);
565 double dx = a.x - b.x; 522 double dx = a.x - b.x;
566 double dy = a.y - b.y; 523 double dy = a.y - b.y;
567 double dz = a.z - b.z; 524 double dz = a.z - b.z;
568 return Math.Sqrt(dx * dx + dy * dy + dz * dz); 525 return Math.Sqrt(dx * dx + dy * dy + dz * dz);
569 } 526 }
570 527
528 public LSL_Float llVecDist(LSL_Vector a, LSL_Vector b)
529 {
530 m_host.AddScriptLPS(1);
531 return VecDist(a, b);
532 }
533
571 //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke 534 //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke
572 535
573 // Utility function for llRot2Euler 536 // Utility function for llRot2Euler
@@ -1010,7 +973,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1010 UUID.TryParse(ID, out keyID); 973 UUID.TryParse(ID, out keyID);
1011 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 974 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
1012 if (wComm != null) 975 if (wComm != null)
1013 return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); 976 return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg);
1014 else 977 else
1015 return -1; 978 return -1;
1016 } 979 }
@@ -1020,7 +983,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1020 m_host.AddScriptLPS(1); 983 m_host.AddScriptLPS(1);
1021 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 984 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
1022 if (wComm != null) 985 if (wComm != null)
1023 wComm.ListenControl(m_itemID, number, active); 986 wComm.ListenControl(m_item.ItemID, number, active);
1024 } 987 }
1025 988
1026 public void llListenRemove(int number) 989 public void llListenRemove(int number)
@@ -1028,7 +991,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1028 m_host.AddScriptLPS(1); 991 m_host.AddScriptLPS(1);
1029 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 992 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
1030 if (wComm != null) 993 if (wComm != null)
1031 wComm.ListenRemove(m_itemID, number); 994 wComm.ListenRemove(m_item.ItemID, number);
1032 } 995 }
1033 996
1034 public void llSensor(string name, string id, int type, double range, double arc) 997 public void llSensor(string name, string id, int type, double range, double arc)
@@ -1037,7 +1000,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1037 UUID keyID = UUID.Zero; 1000 UUID keyID = UUID.Zero;
1038 UUID.TryParse(id, out keyID); 1001 UUID.TryParse(id, out keyID);
1039 1002
1040 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); 1003 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host);
1041 } 1004 }
1042 1005
1043 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) 1006 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate)
@@ -1046,13 +1009,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1046 UUID keyID = UUID.Zero; 1009 UUID keyID = UUID.Zero;
1047 UUID.TryParse(id, out keyID); 1010 UUID.TryParse(id, out keyID);
1048 1011
1049 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); 1012 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host);
1050 } 1013 }
1051 1014
1052 public void llSensorRemove() 1015 public void llSensorRemove()
1053 { 1016 {
1054 m_host.AddScriptLPS(1); 1017 m_host.AddScriptLPS(1);
1055 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); 1018 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID);
1056 } 1019 }
1057 1020
1058 public string resolveName(UUID objecUUID) 1021 public string resolveName(UUID objecUUID)
@@ -1093,7 +1056,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1093 public LSL_String llDetectedName(int number) 1056 public LSL_String llDetectedName(int number)
1094 { 1057 {
1095 m_host.AddScriptLPS(1); 1058 m_host.AddScriptLPS(1);
1096 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1059 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1097 if (detectedParams == null) 1060 if (detectedParams == null)
1098 return String.Empty; 1061 return String.Empty;
1099 return detectedParams.Name; 1062 return detectedParams.Name;
@@ -1102,7 +1065,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1102 public LSL_String llDetectedKey(int number) 1065 public LSL_String llDetectedKey(int number)
1103 { 1066 {
1104 m_host.AddScriptLPS(1); 1067 m_host.AddScriptLPS(1);
1105 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1068 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1106 if (detectedParams == null) 1069 if (detectedParams == null)
1107 return String.Empty; 1070 return String.Empty;
1108 return detectedParams.Key.ToString(); 1071 return detectedParams.Key.ToString();
@@ -1111,7 +1074,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1111 public LSL_String llDetectedOwner(int number) 1074 public LSL_String llDetectedOwner(int number)
1112 { 1075 {
1113 m_host.AddScriptLPS(1); 1076 m_host.AddScriptLPS(1);
1114 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1077 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1115 if (detectedParams == null) 1078 if (detectedParams == null)
1116 return String.Empty; 1079 return String.Empty;
1117 return detectedParams.Owner.ToString(); 1080 return detectedParams.Owner.ToString();
@@ -1120,7 +1083,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1120 public LSL_Integer llDetectedType(int number) 1083 public LSL_Integer llDetectedType(int number)
1121 { 1084 {
1122 m_host.AddScriptLPS(1); 1085 m_host.AddScriptLPS(1);
1123 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1086 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1124 if (detectedParams == null) 1087 if (detectedParams == null)
1125 return 0; 1088 return 0;
1126 return new LSL_Integer(detectedParams.Type); 1089 return new LSL_Integer(detectedParams.Type);
@@ -1129,7 +1092,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1129 public LSL_Vector llDetectedPos(int number) 1092 public LSL_Vector llDetectedPos(int number)
1130 { 1093 {
1131 m_host.AddScriptLPS(1); 1094 m_host.AddScriptLPS(1);
1132 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1095 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1133 if (detectedParams == null) 1096 if (detectedParams == null)
1134 return new LSL_Vector(); 1097 return new LSL_Vector();
1135 return detectedParams.Position; 1098 return detectedParams.Position;
@@ -1138,7 +1101,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1138 public LSL_Vector llDetectedVel(int number) 1101 public LSL_Vector llDetectedVel(int number)
1139 { 1102 {
1140 m_host.AddScriptLPS(1); 1103 m_host.AddScriptLPS(1);
1141 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1104 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1142 if (detectedParams == null) 1105 if (detectedParams == null)
1143 return new LSL_Vector(); 1106 return new LSL_Vector();
1144 return detectedParams.Velocity; 1107 return detectedParams.Velocity;
@@ -1147,7 +1110,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1147 public LSL_Vector llDetectedGrab(int number) 1110 public LSL_Vector llDetectedGrab(int number)
1148 { 1111 {
1149 m_host.AddScriptLPS(1); 1112 m_host.AddScriptLPS(1);
1150 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1113 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1151 if (parms == null) 1114 if (parms == null)
1152 return new LSL_Vector(0, 0, 0); 1115 return new LSL_Vector(0, 0, 0);
1153 1116
@@ -1157,7 +1120,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1157 public LSL_Rotation llDetectedRot(int number) 1120 public LSL_Rotation llDetectedRot(int number)
1158 { 1121 {
1159 m_host.AddScriptLPS(1); 1122 m_host.AddScriptLPS(1);
1160 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1123 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1161 if (detectedParams == null) 1124 if (detectedParams == null)
1162 return new LSL_Rotation(); 1125 return new LSL_Rotation();
1163 return detectedParams.Rotation; 1126 return detectedParams.Rotation;
@@ -1166,7 +1129,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1166 public LSL_Integer llDetectedGroup(int number) 1129 public LSL_Integer llDetectedGroup(int number)
1167 { 1130 {
1168 m_host.AddScriptLPS(1); 1131 m_host.AddScriptLPS(1);
1169 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1132 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1170 if (detectedParams == null) 1133 if (detectedParams == null)
1171 return new LSL_Integer(0); 1134 return new LSL_Integer(0);
1172 if (m_host.GroupID == detectedParams.Group) 1135 if (m_host.GroupID == detectedParams.Group)
@@ -1177,7 +1140,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1177 public LSL_Integer llDetectedLinkNumber(int number) 1140 public LSL_Integer llDetectedLinkNumber(int number)
1178 { 1141 {
1179 m_host.AddScriptLPS(1); 1142 m_host.AddScriptLPS(1);
1180 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1143 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1181 if (parms == null) 1144 if (parms == null)
1182 return new LSL_Integer(0); 1145 return new LSL_Integer(0);
1183 1146
@@ -1190,7 +1153,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1190 public LSL_Vector llDetectedTouchBinormal(int index) 1153 public LSL_Vector llDetectedTouchBinormal(int index)
1191 { 1154 {
1192 m_host.AddScriptLPS(1); 1155 m_host.AddScriptLPS(1);
1193 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1156 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1194 if (detectedParams == null) 1157 if (detectedParams == null)
1195 return new LSL_Vector(); 1158 return new LSL_Vector();
1196 return detectedParams.TouchBinormal; 1159 return detectedParams.TouchBinormal;
@@ -1202,7 +1165,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1202 public LSL_Integer llDetectedTouchFace(int index) 1165 public LSL_Integer llDetectedTouchFace(int index)
1203 { 1166 {
1204 m_host.AddScriptLPS(1); 1167 m_host.AddScriptLPS(1);
1205 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1168 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1206 if (detectedParams == null) 1169 if (detectedParams == null)
1207 return new LSL_Integer(-1); 1170 return new LSL_Integer(-1);
1208 return new LSL_Integer(detectedParams.TouchFace); 1171 return new LSL_Integer(detectedParams.TouchFace);
@@ -1214,7 +1177,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1214 public LSL_Vector llDetectedTouchNormal(int index) 1177 public LSL_Vector llDetectedTouchNormal(int index)
1215 { 1178 {
1216 m_host.AddScriptLPS(1); 1179 m_host.AddScriptLPS(1);
1217 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1180 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1218 if (detectedParams == null) 1181 if (detectedParams == null)
1219 return new LSL_Vector(); 1182 return new LSL_Vector();
1220 return detectedParams.TouchNormal; 1183 return detectedParams.TouchNormal;
@@ -1226,7 +1189,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1226 public LSL_Vector llDetectedTouchPos(int index) 1189 public LSL_Vector llDetectedTouchPos(int index)
1227 { 1190 {
1228 m_host.AddScriptLPS(1); 1191 m_host.AddScriptLPS(1);
1229 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1192 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1230 if (detectedParams == null) 1193 if (detectedParams == null)
1231 return new LSL_Vector(); 1194 return new LSL_Vector();
1232 return detectedParams.TouchPos; 1195 return detectedParams.TouchPos;
@@ -1238,7 +1201,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1238 public LSL_Vector llDetectedTouchST(int index) 1201 public LSL_Vector llDetectedTouchST(int index)
1239 { 1202 {
1240 m_host.AddScriptLPS(1); 1203 m_host.AddScriptLPS(1);
1241 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1204 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1242 if (detectedParams == null) 1205 if (detectedParams == null)
1243 return new LSL_Vector(-1.0, -1.0, 0.0); 1206 return new LSL_Vector(-1.0, -1.0, 0.0);
1244 return detectedParams.TouchST; 1207 return detectedParams.TouchST;
@@ -1250,7 +1213,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1250 public LSL_Vector llDetectedTouchUV(int index) 1213 public LSL_Vector llDetectedTouchUV(int index)
1251 { 1214 {
1252 m_host.AddScriptLPS(1); 1215 m_host.AddScriptLPS(1);
1253 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1216 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1254 if (detectedParams == null) 1217 if (detectedParams == null)
1255 return new LSL_Vector(-1.0, -1.0, 0.0); 1218 return new LSL_Vector(-1.0, -1.0, 0.0);
1256 return detectedParams.TouchUV; 1219 return detectedParams.TouchUV;
@@ -1433,6 +1396,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1433 } 1396 }
1434 } 1397 }
1435 1398
1399 private bool IsPhysical()
1400 {
1401 return ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) == (uint)PrimFlags.Physics);
1402 }
1403
1436 public LSL_Integer llGetStatus(int status) 1404 public LSL_Integer llGetStatus(int status)
1437 { 1405 {
1438 m_host.AddScriptLPS(1); 1406 m_host.AddScriptLPS(1);
@@ -1440,11 +1408,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1440 switch (status) 1408 switch (status)
1441 { 1409 {
1442 case ScriptBaseClass.STATUS_PHYSICS: 1410 case ScriptBaseClass.STATUS_PHYSICS:
1443 if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) == (uint)PrimFlags.Physics) 1411 return IsPhysical() ? 1 : 0;
1444 {
1445 return 1;
1446 }
1447 return 0;
1448 1412
1449 case ScriptBaseClass.STATUS_PHANTOM: 1413 case ScriptBaseClass.STATUS_PHANTOM:
1450 if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) == (uint)PrimFlags.Phantom) 1414 if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) == (uint)PrimFlags.Phantom)
@@ -1962,6 +1926,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1962 rgb.x = texcolor.R; 1926 rgb.x = texcolor.R;
1963 rgb.y = texcolor.G; 1927 rgb.y = texcolor.G;
1964 rgb.z = texcolor.B; 1928 rgb.z = texcolor.B;
1929
1965 return rgb; 1930 return rgb;
1966 } 1931 }
1967 else 1932 else
@@ -2196,11 +2161,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2196 { 2161 {
2197 m_host.AddScriptLPS(1); 2162 m_host.AddScriptLPS(1);
2198 2163
2199 SetPos(m_host, pos); 2164 SetPos(m_host, pos, true);
2200 2165
2201 ScriptSleep(200); 2166 ScriptSleep(200);
2202 } 2167 }
2203 2168
2169 /// <summary>
2170 /// Tries to move the entire object so that the root prim is within 0.1m of position. http://wiki.secondlife.com/wiki/LlSetRegionPos
2171 /// Documentation indicates that the use of x/y coordinates up to 10 meters outside the bounds of a region will work but do not specify what happens if there is no adjacent region for the object to move into.
2172 /// Uses the RegionSize constant here rather than hard-coding 266.0 to alert any developer modifying OpenSim to support variable-sized regions that this method will need tweaking.
2173 /// </summary>
2174 /// <param name="pos"></param>
2175 /// <returns>1 if successful, 0 otherwise.</returns>
2176 public LSL_Integer llSetRegionPos(LSL_Vector pos)
2177 {
2178 m_host.AddScriptLPS(1);
2179
2180 // BEGIN WORKAROUND
2181 // IF YOU GET REGION CROSSINGS WORKING WITH THIS FUNCTION, REPLACE THE WORKAROUND.
2182 //
2183 // This workaround is to prevent silent failure of this function.
2184 // According to the specification on the SL Wiki, providing a position outside of the
2185 if (pos.x < 0 || pos.x > Constants.RegionSize || pos.y < 0 || pos.y > Constants.RegionSize)
2186 {
2187 return 0;
2188 }
2189 // END WORK AROUND
2190 else if ( // this is not part of the workaround if-block because it's not related to the workaround.
2191 IsPhysical() ||
2192 m_host.ParentGroup.IsAttachment || // return FALSE if attachment
2193 (
2194 pos.x < -10.0 || // return FALSE if more than 10 meters into a west-adjacent region.
2195 pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region.
2196 pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region.
2197 pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region.
2198 pos.z > 4096 // return FALSE if altitude than 4096m
2199 )
2200 )
2201 {
2202 return 0;
2203 }
2204
2205 // if we reach this point, then the object is not physical, it's not an attachment, and the destination is within the valid range.
2206 // this could possibly be done in the above else-if block, but we're doing the check here to keep the code easier to read.
2207
2208 Vector3 objectPos = m_host.ParentGroup.RootPart.AbsolutePosition;
2209 LandData here = World.GetLandData((float)objectPos.X, (float)objectPos.Y);
2210 LandData there = World.GetLandData((float)pos.x, (float)pos.y);
2211
2212 // we're only checking prim limits if it's moving to a different parcel under the assumption that if the object got onto the parcel without exceeding the prim limits.
2213
2214 bool sameParcel = here.GlobalID == there.GlobalID;
2215
2216 if (!sameParcel && !World.Permissions.CanObjectEntry(m_host.UUID, false, new Vector3((float)pos.x, (float)pos.y, (float)pos.z)))
2217 {
2218 return 0;
2219 }
2220
2221 SetPos(m_host.ParentGroup.RootPart, pos, false);
2222
2223 return VecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0;
2224 }
2225
2204 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) 2226 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos)
2205 // note linked setpos is capped "differently" 2227 // note linked setpos is capped "differently"
2206 private LSL_Vector SetPosAdjust(LSL_Vector start, LSL_Vector end) 2228 private LSL_Vector SetPosAdjust(LSL_Vector start, LSL_Vector end)
@@ -2232,55 +2254,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2232 return real_vec; 2254 return real_vec;
2233 } 2255 }
2234 2256
2235 public LSL_Integer llSetRegionPos(LSL_Vector pos) 2257 /// <summary>
2236 { 2258 /// set object position, optionally capping the distance.
2237 return new LSL_Integer(SetRegionPos(m_host, pos)); 2259 /// </summary>
2238 } 2260 /// <param name="part"></param>
2239 2261 /// <param name="targetPos"></param>
2240 protected int SetRegionPos(SceneObjectPart part, LSL_Vector targetPos) 2262 /// <param name="adjust">if TRUE, will cap the distance to 10m.</param>
2241 { 2263 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos, bool adjust)
2242 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2243 return 0;
2244
2245 SceneObjectGroup grp = part.ParentGroup;
2246
2247 if (grp.IsAttachment)
2248 return 0;
2249
2250 if (grp.RootPart.PhysActor != null && grp.RootPart.PhysActor.IsPhysical)
2251 return 0;
2252
2253 if (targetPos.x < -10.0f || targetPos.x >= (float)Constants.RegionSize || targetPos.y < -10.0f || targetPos.y >= (float)Constants.RegionSize || targetPos.z < 0 || targetPos.z >= 4096.0f)
2254 return 0;
2255
2256 float constrainedX = (float)targetPos.x;
2257 float constrainedY = (float)targetPos.y;
2258
2259 if (constrainedX < 0.0f)
2260 constrainedX = 0.0f;
2261 if (constrainedY < 0.0f)
2262 constrainedY = 0.0f;
2263 if (constrainedX >= (float)Constants.RegionSize)
2264 constrainedX = (float)Constants.RegionSize - 0.1f;
2265 if (constrainedY >= (float)Constants.RegionSize)
2266 constrainedY = (float)Constants.RegionSize -0.1f;
2267
2268 float ground = World.GetGroundHeight(constrainedX, constrainedY);
2269
2270 if (targetPos.z < ground)
2271 targetPos.z = ground;
2272
2273 Vector3 dest = new Vector3((float)targetPos.x, (float)targetPos.y, (float)targetPos.z);
2274
2275 if (!World.Permissions.CanObjectEntry(grp.UUID, false, dest))
2276 return 0;
2277
2278 grp.UpdateGroupPosition(dest);
2279
2280 return 1;
2281 }
2282
2283 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos)
2284 { 2264 {
2285 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 2265 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2286 return; 2266 return;
@@ -3044,20 +3024,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3044 3024
3045 public LSL_Integer llGiveMoney(string destination, int amount) 3025 public LSL_Integer llGiveMoney(string destination, int amount)
3046 { 3026 {
3047 UUID invItemID=InventorySelf();
3048 if (invItemID == UUID.Zero)
3049 return 0;
3050
3051 m_host.AddScriptLPS(1); 3027 m_host.AddScriptLPS(1);
3052 3028
3053 m_host.TaskInventory.LockItemsForRead(true); 3029 if (m_item.PermsGranter == UUID.Zero)
3054 TaskInventoryItem item = m_host.TaskInventory[invItemID];
3055 m_host.TaskInventory.LockItemsForRead(false);
3056
3057 if (item.PermsGranter == UUID.Zero)
3058 return 0; 3030 return 0;
3059 3031
3060 if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) 3032 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0)
3061 { 3033 {
3062 LSLError("No permissions to give money"); 3034 LSLError("No permissions to give money");
3063 return 0; 3035 return 0;
@@ -3120,74 +3092,72 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3120 { 3092 {
3121 m_host.AddScriptLPS(1); 3093 m_host.AddScriptLPS(1);
3122 3094
3123 Util.FireAndForget(delegate (object x) 3095 Util.FireAndForget(x =>
3124 { 3096 {
3125 if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s)) 3097 if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s))
3126 return; 3098 return;
3099
3127 float dist = (float)llVecDist(llGetPos(), pos); 3100 float dist = (float)llVecDist(llGetPos(), pos);
3128 3101
3129 if (dist > m_ScriptDistanceFactor * 10.0f) 3102 if (dist > m_ScriptDistanceFactor * 10.0f)
3130 return; 3103 return;
3131 3104
3132 //Clone is thread-safe 3105 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory);
3133 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
3134 3106
3135 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory) 3107 if (item == null)
3136 { 3108 {
3137 if (inv.Value.Name == inventory) 3109 llSay(0, "Could not find object " + inventory);
3138 { 3110 return;
3139 // make sure we're an object. 3111 }
3140 if (inv.Value.InvType != (int)InventoryType.Object)
3141 {
3142 llSay(0, "Unable to create requested object. Object is missing from database.");
3143 return;
3144 }
3145 3112
3146 Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); 3113 if (item.InvType != (int)InventoryType.Object)
3147 Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z); 3114 {
3115 llSay(0, "Unable to create requested object. Object is missing from database.");
3116 return;
3117 }
3148 3118
3149 // need the magnitude later 3119 Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
3150 // float velmag = (float)Util.GetMagnitude(llvel); 3120 Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z);
3151 3121
3152 SceneObjectGroup new_group = World.RezObject(m_host, inv.Value, llpos, Rot2Quaternion(rot), llvel, param); 3122 // need the magnitude later
3123 // float velmag = (float)Util.GetMagnitude(llvel);
3153 3124
3154 // If either of these are null, then there was an unknown error. 3125 SceneObjectGroup new_group = World.RezObject(m_host, item, llpos, Rot2Quaternion(rot), llvel, param);
3155 if (new_group == null)
3156 continue;
3157 3126
3158 // objects rezzed with this method are die_at_edge by default. 3127 // If either of these are null, then there was an unknown error.
3159 new_group.RootPart.SetDieAtEdge(true); 3128 if (new_group == null)
3129 return;
3160 3130
3161 new_group.ResumeScripts(); 3131 // objects rezzed with this method are die_at_edge by default.
3132 new_group.RootPart.SetDieAtEdge(true);
3162 3133
3163 m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( 3134 new_group.ResumeScripts();
3164 "object_rez", new Object[] {
3165 new LSL_String(
3166 new_group.RootPart.UUID.ToString()) },
3167 new DetectParams[0]));
3168 3135
3169 // do recoil 3136 m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams(
3170 SceneObjectGroup hostgrp = m_host.ParentGroup; 3137 "object_rez", new Object[] {
3171 if (hostgrp == null) 3138 new LSL_String(
3172 return; 3139 new_group.RootPart.UUID.ToString()) },
3140 new DetectParams[0]));
3141
3142 // do recoil
3143 SceneObjectGroup hostgrp = m_host.ParentGroup;
3144 if (hostgrp == null)
3145 return;
3173 3146
3174 if (hostgrp.IsAttachment) // don't recoil avatars 3147 if (hostgrp.IsAttachment) // don't recoil avatars
3175 return; 3148 return;
3176 3149
3177 PhysicsActor pa = new_group.RootPart.PhysActor; 3150 PhysicsActor pa = new_group.RootPart.PhysActor;
3178 3151
3179 if (pa != null && pa.IsPhysical && llvel != Vector3.Zero) 3152 if (pa != null && pa.IsPhysical && llvel != Vector3.Zero)
3180 { 3153 {
3181 float groupmass = new_group.GetMass(); 3154 float groupmass = new_group.GetMass();
3182 llvel *= -groupmass; 3155 llvel *= -groupmass;
3183 llApplyImpulse(new LSL_Vector(llvel.X, llvel.Y,llvel.Z), 0); 3156 llApplyImpulse(new LSL_Vector(llvel.X, llvel.Y,llvel.Z), 0);
3184 }
3185 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
3186 return;
3187 }
3188 } 3157 }
3158 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
3159 return;
3189 3160
3190 llSay(0, "Could not find object " + inventory);
3191 }); 3161 });
3192 3162
3193 //ScriptSleep((int)((groupmass * velmag) / 10)); 3163 //ScriptSleep((int)((groupmass * velmag) / 10));
@@ -3251,11 +3221,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3251 sec = m_MinTimerInterval; 3221 sec = m_MinTimerInterval;
3252 m_host.AddScriptLPS(1); 3222 m_host.AddScriptLPS(1);
3253 // Setting timer repeat 3223 // Setting timer repeat
3254 AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); 3224 AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec);
3255 } 3225 }
3256 3226
3257 public virtual void llSleep(double sec) 3227 public virtual void llSleep(double sec)
3258 { 3228 {
3229// m_log.Info("llSleep snoozing " + sec + "s.");
3259 m_host.AddScriptLPS(1); 3230 m_host.AddScriptLPS(1);
3260 Thread.Sleep((int)(sec * 1000)); 3231 Thread.Sleep((int)(sec * 1000));
3261 } 3232 }
@@ -3314,29 +3285,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3314 3285
3315 public void llTakeControls(int controls, int accept, int pass_on) 3286 public void llTakeControls(int controls, int accept, int pass_on)
3316 { 3287 {
3317 TaskInventoryItem item; 3288 if (m_item.PermsGranter != UUID.Zero)
3318
3319 m_host.TaskInventory.LockItemsForRead(true);
3320 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3321 { 3289 {
3322 m_host.TaskInventory.LockItemsForRead(false); 3290 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3323 return;
3324 }
3325 else
3326 {
3327 item = m_host.TaskInventory[InventorySelf()];
3328 }
3329 m_host.TaskInventory.LockItemsForRead(false);
3330
3331 if (item.PermsGranter != UUID.Zero)
3332 {
3333 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3334 3291
3335 if (presence != null) 3292 if (presence != null)
3336 { 3293 {
3337 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3294 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3338 { 3295 {
3339 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); 3296 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID);
3340 } 3297 }
3341 } 3298 }
3342 } 3299 }
@@ -3346,38 +3303,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3346 3303
3347 public void llReleaseControls() 3304 public void llReleaseControls()
3348 { 3305 {
3349 TaskInventoryItem item;
3350
3351 m_host.TaskInventory.LockItemsForRead(true);
3352 lock (m_host.TaskInventory)
3353 {
3354
3355 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3356 {
3357 m_host.TaskInventory.LockItemsForRead(false);
3358 return;
3359 }
3360 else
3361 {
3362 item = m_host.TaskInventory[InventorySelf()];
3363 }
3364 }
3365 m_host.TaskInventory.LockItemsForRead(false);
3366
3367 m_host.AddScriptLPS(1); 3306 m_host.AddScriptLPS(1);
3368 3307
3369 if (item.PermsGranter != UUID.Zero) 3308 if (m_item.PermsGranter != UUID.Zero)
3370 { 3309 {
3371 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3310 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3372 3311
3373 if (presence != null) 3312 if (presence != null)
3374 { 3313 {
3375 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3314 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3376 { 3315 {
3377 // Unregister controls from Presence 3316 // Unregister controls from Presence
3378 presence.UnRegisterControlEventsToScript(m_localID, m_itemID); 3317 presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
3379 // Remove Take Control permission. 3318 // Remove Take Control permission.
3380 item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; 3319 m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
3381 } 3320 }
3382 } 3321 }
3383 } 3322 }
@@ -3390,86 +3329,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3390 m_UrlModule.ReleaseURL(url); 3329 m_UrlModule.ReleaseURL(url);
3391 } 3330 }
3392 3331
3393 public void llAttachToAvatar(int attachment) 3332 /// <summary>
3333 /// Attach the object containing this script to the avatar that owns it.
3334 /// </summary>
3335 /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param>
3336 /// <returns>true if the attach suceeded, false if it did not</returns>
3337 public bool AttachToAvatar(int attachmentPoint)
3394 { 3338 {
3395 m_host.AddScriptLPS(1); 3339 SceneObjectGroup grp = m_host.ParentGroup;
3396 3340 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
3397 TaskInventoryItem item;
3398 3341
3399 m_host.TaskInventory.LockItemsForRead(true); 3342 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3400 3343
3401 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3344 if (attachmentsModule != null)
3402 { 3345 return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false, true);
3403 m_host.TaskInventory.LockItemsForRead(false);
3404 return;
3405 }
3406 else 3346 else
3407 { 3347 return false;
3408 item = m_host.TaskInventory[InventorySelf()]; 3348 }
3409 }
3410
3411 m_host.TaskInventory.LockItemsForRead(false);
3412 3349
3413 if (item.PermsGranter != m_host.OwnerID) 3350 /// <summary>
3414 return; 3351 /// Detach the object containing this script from the avatar it is attached to.
3352 /// </summary>
3353 /// <remarks>
3354 /// Nothing happens if the object is not attached.
3355 /// </remarks>
3356 public void DetachFromAvatar()
3357 {
3358 Util.FireAndForget(DetachWrapper, m_host);
3359 }
3415 3360
3416 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3361 private void DetachWrapper(object o)
3362 {
3363 if (World.AttachmentsModule != null)
3417 { 3364 {
3418 SceneObjectGroup grp = m_host.ParentGroup; 3365 SceneObjectPart host = (SceneObjectPart)o;
3419 3366 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3420 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 3367 World.AttachmentsModule.DetachSingleAttachmentToInv(presence, host.ParentGroup);
3421
3422 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3423 if (attachmentsModule != null)
3424 attachmentsModule.AttachObject(presence, grp, (uint)attachment, false, true);
3425 } 3368 }
3426 } 3369 }
3427 3370
3428 public void llDetachFromAvatar() 3371 public void llAttachToAvatar(int attachmentPoint)
3429 { 3372 {
3430 m_host.AddScriptLPS(1); 3373 m_host.AddScriptLPS(1);
3431 3374
3432 if (m_host.ParentGroup.AttachmentPoint == 0) 3375 if (m_item.PermsGranter != m_host.OwnerID)
3433 return; 3376 return;
3434 3377
3435 TaskInventoryItem item; 3378 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3379 AttachToAvatar(attachmentPoint);
3380 }
3436 3381
3437 m_host.TaskInventory.LockItemsForRead(true); 3382 public void llDetachFromAvatar()
3383 {
3384 m_host.AddScriptLPS(1);
3438 3385
3439 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3386 if (m_host.ParentGroup.AttachmentPoint == 0)
3440 {
3441 m_host.TaskInventory.LockItemsForRead(false);
3442 return; 3387 return;
3443 }
3444 else
3445 {
3446 item = m_host.TaskInventory[InventorySelf()];
3447 }
3448 m_host.TaskInventory.LockItemsForRead(false);
3449 3388
3450 3389 if (m_item.PermsGranter != m_host.OwnerID)
3451 if (item.PermsGranter != m_host.OwnerID)
3452 return; 3390 return;
3453 3391
3454 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3392 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3455 { 3393 DetachFromAvatar();
3456 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3457 if (attachmentsModule != null)
3458 Util.FireAndForget(DetachWrapper, m_host);
3459 }
3460 }
3461
3462 private void DetachWrapper(object o)
3463 {
3464 SceneObjectPart host = (SceneObjectPart)o;
3465
3466 SceneObjectGroup grp = host.ParentGroup;
3467 UUID itemID = grp.FromItemID;
3468 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3469
3470 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3471 if (attachmentsModule != null)
3472 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3473 } 3394 }
3474 3395
3475 public void llTakeCamera(string avatar) 3396 public void llTakeCamera(string avatar)
@@ -3590,7 +3511,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3590 } 3511 }
3591 3512
3592 emailModule.SendEmail(m_host.UUID, address, subject, message); 3513 emailModule.SendEmail(m_host.UUID, address, subject, message);
3593 ScriptSleep(15000); 3514 ScriptSleep(EMAIL_PAUSE_TIME * 1000);
3594 } 3515 }
3595 3516
3596 public void llGetNextEmail(string address, string subject) 3517 public void llGetNextEmail(string address, string subject)
@@ -3627,6 +3548,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3627 return m_host.UUID.ToString(); 3548 return m_host.UUID.ToString();
3628 } 3549 }
3629 3550
3551 public LSL_Key llGenerateKey()
3552 {
3553 m_host.AddScriptLPS(1);
3554 return UUID.Random().ToString();
3555 }
3556
3630 public void llSetBuoyancy(double buoyancy) 3557 public void llSetBuoyancy(double buoyancy)
3631 { 3558 {
3632 m_host.AddScriptLPS(1); 3559 m_host.AddScriptLPS(1);
@@ -3673,7 +3600,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3673 m_host.AddScriptLPS(1); 3600 m_host.AddScriptLPS(1);
3674 try 3601 try
3675 { 3602 {
3676 m_ScriptEngine.SetMinEventDelay(m_itemID, delay); 3603 m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay);
3677 } 3604 }
3678 catch (NotImplementedException) 3605 catch (NotImplementedException)
3679 { 3606 {
@@ -3726,29 +3653,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3726 { 3653 {
3727 m_host.AddScriptLPS(1); 3654 m_host.AddScriptLPS(1);
3728 3655
3729 UUID invItemID = InventorySelf(); 3656 if (m_item.PermsGranter == UUID.Zero)
3730 if (invItemID == UUID.Zero)
3731 return; 3657 return;
3732 3658
3733 TaskInventoryItem item; 3659 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3734
3735 m_host.TaskInventory.LockItemsForRead(true);
3736 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3737 { 3660 {
3738 m_host.TaskInventory.LockItemsForRead(false); 3661 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3739 return;
3740 }
3741 else
3742 {
3743 item = m_host.TaskInventory[InventorySelf()];
3744 }
3745 m_host.TaskInventory.LockItemsForRead(false);
3746 if (item.PermsGranter == UUID.Zero)
3747 return;
3748
3749 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3750 {
3751 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3752 3662
3753 if (presence != null) 3663 if (presence != null)
3754 { 3664 {
@@ -3766,41 +3676,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3766 { 3676 {
3767 m_host.AddScriptLPS(1); 3677 m_host.AddScriptLPS(1);
3768 3678
3769 UUID invItemID=InventorySelf(); 3679 if (m_item.PermsGranter == UUID.Zero)
3770 if (invItemID == UUID.Zero)
3771 return;
3772
3773 TaskInventoryItem item;
3774
3775 m_host.TaskInventory.LockItemsForRead(true);
3776 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3777 {
3778 m_host.TaskInventory.LockItemsForRead(false);
3779 return;
3780 }
3781 else
3782 {
3783 item = m_host.TaskInventory[InventorySelf()];
3784 }
3785 m_host.TaskInventory.LockItemsForRead(false);
3786
3787
3788 if (item.PermsGranter == UUID.Zero)
3789 return; 3680 return;
3790 3681
3791 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) 3682 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3792 { 3683 {
3793 UUID animID = new UUID(); 3684 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3794
3795 if (!UUID.TryParse(anim, out animID))
3796 {
3797 animID=InventoryKey(anim);
3798 }
3799
3800 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3801 3685
3802 if (presence != null) 3686 if (presence != null)
3803 { 3687 {
3688 UUID animID = KeyOrName(anim);
3689
3804 if (animID == UUID.Zero) 3690 if (animID == UUID.Zero)
3805 presence.Animator.RemoveAnimation(anim); 3691 presence.Animator.RemoveAnimation(anim);
3806 else 3692 else
@@ -3833,44 +3719,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3833 public LSL_Integer llGetStartParameter() 3719 public LSL_Integer llGetStartParameter()
3834 { 3720 {
3835 m_host.AddScriptLPS(1); 3721 m_host.AddScriptLPS(1);
3836 return m_ScriptEngine.GetStartParameter(m_itemID); 3722 return m_ScriptEngine.GetStartParameter(m_item.ItemID);
3837 } 3723 }
3838 3724
3839 public void llRequestPermissions(string agent, int perm) 3725 public void llRequestPermissions(string agent, int perm)
3840 { 3726 {
3841 UUID agentID = new UUID(); 3727 UUID agentID;
3842 3728
3843 if (!UUID.TryParse(agent, out agentID)) 3729 if (!UUID.TryParse(agent, out agentID))
3844 return; 3730 return;
3845 3731
3846 UUID invItemID = InventorySelf();
3847
3848 if (invItemID == UUID.Zero)
3849 return; // Not in a prim? How??
3850
3851 TaskInventoryItem item;
3852
3853
3854 m_host.TaskInventory.LockItemsForRead(true);
3855 if (!m_host.TaskInventory.ContainsKey(invItemID))
3856 {
3857 m_host.TaskInventory.LockItemsForRead(false);
3858 return;
3859 }
3860 else
3861 {
3862 item = m_host.TaskInventory[invItemID];
3863 }
3864 m_host.TaskInventory.LockItemsForRead(false);
3865
3866 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3732 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3867 { 3733 {
3868 llReleaseControls(); 3734 llReleaseControls();
3869 3735
3870 item.PermsGranter = UUID.Zero; 3736 m_item.PermsGranter = UUID.Zero;
3871 item.PermsMask = 0; 3737 m_item.PermsMask = 0;
3872 3738
3873 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3739 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3874 "run_time_permissions", new Object[] { 3740 "run_time_permissions", new Object[] {
3875 new LSL_Integer(0) }, 3741 new LSL_Integer(0) },
3876 new DetectParams[0])); 3742 new DetectParams[0]));
@@ -3878,7 +3744,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3878 return; 3744 return;
3879 } 3745 }
3880 3746
3881 if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3747 if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3882 llReleaseControls(); 3748 llReleaseControls();
3883 3749
3884 m_host.AddScriptLPS(1); 3750 m_host.AddScriptLPS(1);
@@ -3895,11 +3761,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3895 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3761 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3896 { 3762 {
3897 m_host.TaskInventory.LockItemsForWrite(true); 3763 m_host.TaskInventory.LockItemsForWrite(true);
3898 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3764 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3899 m_host.TaskInventory[invItemID].PermsMask = perm; 3765 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3900 m_host.TaskInventory.LockItemsForWrite(false); 3766 m_host.TaskInventory.LockItemsForWrite(false);
3901 3767
3902 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3768 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3903 "run_time_permissions", new Object[] { 3769 "run_time_permissions", new Object[] {
3904 new LSL_Integer(perm) }, 3770 new LSL_Integer(perm) },
3905 new DetectParams[0])); 3771 new DetectParams[0]));
@@ -3934,11 +3800,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3934 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3800 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3935 { 3801 {
3936 m_host.TaskInventory.LockItemsForWrite(true); 3802 m_host.TaskInventory.LockItemsForWrite(true);
3937 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3803 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3938 m_host.TaskInventory[invItemID].PermsMask = perm; 3804 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3939 m_host.TaskInventory.LockItemsForWrite(false); 3805 m_host.TaskInventory.LockItemsForWrite(false);
3940 3806
3941 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3807 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3942 "run_time_permissions", new Object[] { 3808 "run_time_permissions", new Object[] {
3943 new LSL_Integer(perm) }, 3809 new LSL_Integer(perm) },
3944 new DetectParams[0])); 3810 new DetectParams[0]));
@@ -3949,9 +3815,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3949 } 3815 }
3950 3816
3951 ScenePresence presence = World.GetScenePresence(agentID); 3817 ScenePresence presence = World.GetScenePresence(agentID);
3952
3953 if (presence != null) 3818 if (presence != null)
3954 { 3819 {
3820 // If permissions are being requested from an NPC and were not implicitly granted above then
3821 // auto grant all reuqested permissions if the script is owned by the NPC or the NPCs owner
3822 INPCModule npcModule = World.RequestModuleInterface<INPCModule>();
3823 if (npcModule != null && npcModule.IsNPC(agentID, World))
3824 {
3825 if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID)
3826 {
3827 lock (m_host.TaskInventory)
3828 {
3829 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3830 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3831 }
3832
3833 m_ScriptEngine.PostScriptEvent(
3834 m_item.ItemID,
3835 new EventParams(
3836 "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0]));
3837 }
3838
3839 // it is an NPC, exit even if the permissions werent granted above, they are not going to answer
3840 // the question!
3841 return;
3842 }
3843
3955 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); 3844 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID);
3956 if (ownerName == String.Empty) 3845 if (ownerName == String.Empty)
3957 ownerName = "(hippos)"; 3846 ownerName = "(hippos)";
@@ -3959,8 +3848,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3959 if (!m_waitingForScriptAnswer) 3848 if (!m_waitingForScriptAnswer)
3960 { 3849 {
3961 m_host.TaskInventory.LockItemsForWrite(true); 3850 m_host.TaskInventory.LockItemsForWrite(true);
3962 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3851 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3963 m_host.TaskInventory[invItemID].PermsMask = 0; 3852 m_host.TaskInventory[m_item.ItemID].PermsMask = 0;
3964 m_host.TaskInventory.LockItemsForWrite(false); 3853 m_host.TaskInventory.LockItemsForWrite(false);
3965 3854
3966 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3855 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
@@ -3968,16 +3857,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3968 } 3857 }
3969 3858
3970 presence.ControllingClient.SendScriptQuestion( 3859 presence.ControllingClient.SendScriptQuestion(
3971 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); 3860 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm);
3972 3861
3973 return; 3862 return;
3974 } 3863 }
3975 3864
3976 // Requested agent is not in range, refuse perms 3865 // Requested agent is not in range, refuse perms
3977 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3866 m_ScriptEngine.PostScriptEvent(
3978 "run_time_permissions", new Object[] { 3867 m_item.ItemID,
3979 new LSL_Integer(0) }, 3868 new EventParams("run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0]));
3980 new DetectParams[0]));
3981 } 3869 }
3982 3870
3983 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) 3871 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer)
@@ -3985,24 +3873,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3985 if (taskID != m_host.UUID) 3873 if (taskID != m_host.UUID)
3986 return; 3874 return;
3987 3875
3988 UUID invItemID = InventorySelf(); 3876 client.OnScriptAnswer -= handleScriptAnswer;
3989 3877 m_waitingForScriptAnswer = false;
3990 if (invItemID == UUID.Zero)
3991 return;
3992
3993 client.OnScriptAnswer-=handleScriptAnswer;
3994 m_waitingForScriptAnswer=false;
3995 3878
3996 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3879 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3997 llReleaseControls(); 3880 llReleaseControls();
3998 3881
3999
4000 m_host.TaskInventory.LockItemsForWrite(true); 3882 m_host.TaskInventory.LockItemsForWrite(true);
4001 m_host.TaskInventory[invItemID].PermsMask = answer; 3883 m_host.TaskInventory[m_item.ItemID].PermsMask = answer;
4002 m_host.TaskInventory.LockItemsForWrite(false); 3884 m_host.TaskInventory.LockItemsForWrite(false);
4003 3885
4004 3886 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
4005 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
4006 "run_time_permissions", new Object[] { 3887 "run_time_permissions", new Object[] {
4007 new LSL_Integer(answer) }, 3888 new LSL_Integer(answer) },
4008 new DetectParams[0])); 3889 new DetectParams[0]));
@@ -4012,41 +3893,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4012 { 3893 {
4013 m_host.AddScriptLPS(1); 3894 m_host.AddScriptLPS(1);
4014 3895
4015 m_host.TaskInventory.LockItemsForRead(true); 3896 return m_item.PermsGranter.ToString();
4016
4017 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
4018 {
4019 if (item.Type == 10 && item.ItemID == m_itemID)
4020 {
4021 m_host.TaskInventory.LockItemsForRead(false);
4022 return item.PermsGranter.ToString();
4023 }
4024 }
4025 m_host.TaskInventory.LockItemsForRead(false);
4026
4027 return UUID.Zero.ToString();
4028 } 3897 }
4029 3898
4030 public LSL_Integer llGetPermissions() 3899 public LSL_Integer llGetPermissions()
4031 { 3900 {
4032 m_host.AddScriptLPS(1); 3901 m_host.AddScriptLPS(1);
4033 3902
4034 m_host.TaskInventory.LockItemsForRead(true); 3903 int perms = m_item.PermsMask;
4035 3904
4036 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3905 if (m_automaticLinkPermission)
4037 { 3906 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
4038 if (item.Type == 10 && item.ItemID == m_itemID)
4039 {
4040 int perms = item.PermsMask;
4041 if (m_automaticLinkPermission)
4042 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
4043 m_host.TaskInventory.LockItemsForRead(false);
4044 return perms;
4045 }
4046 }
4047 m_host.TaskInventory.LockItemsForRead(false);
4048 3907
4049 return 0; 3908 return perms;
4050 } 3909 }
4051 3910
4052 public LSL_Integer llGetLinkNumber() 3911 public LSL_Integer llGetLinkNumber()
@@ -4084,18 +3943,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4084 public void llCreateLink(string target, int parent) 3943 public void llCreateLink(string target, int parent)
4085 { 3944 {
4086 m_host.AddScriptLPS(1); 3945 m_host.AddScriptLPS(1);
4087 UUID invItemID = InventorySelf(); 3946
4088 UUID targetID; 3947 UUID targetID;
4089 3948
4090 if (!UUID.TryParse(target, out targetID)) 3949 if (!UUID.TryParse(target, out targetID))
4091 return; 3950 return;
4092 3951
4093 TaskInventoryItem item; 3952 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4094 m_host.TaskInventory.LockItemsForRead(true);
4095 item = m_host.TaskInventory[invItemID];
4096 m_host.TaskInventory.LockItemsForRead(false);
4097
4098 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4099 && !m_automaticLinkPermission) 3953 && !m_automaticLinkPermission)
4100 { 3954 {
4101 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3955 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
@@ -4103,7 +3957,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4103 } 3957 }
4104 3958
4105 IClientAPI client = null; 3959 IClientAPI client = null;
4106 ScenePresence sp = World.GetScenePresence(item.PermsGranter); 3960 ScenePresence sp = World.GetScenePresence(m_item.PermsGranter);
4107 if (sp != null) 3961 if (sp != null)
4108 client = sp.ControllingClient; 3962 client = sp.ControllingClient;
4109 3963
@@ -4149,18 +4003,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4149 public void llBreakLink(int linknum) 4003 public void llBreakLink(int linknum)
4150 { 4004 {
4151 m_host.AddScriptLPS(1); 4005 m_host.AddScriptLPS(1);
4152 UUID invItemID = InventorySelf();
4153 4006
4154 m_host.TaskInventory.LockItemsForRead(true); 4007 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4155 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 4008 && !m_automaticLinkPermission)
4156 && !m_automaticLinkPermission) 4009 {
4157 { 4010 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
4158 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 4011 return;
4159 m_host.TaskInventory.LockItemsForRead(false); 4012 }
4160 return; 4013
4161 }
4162 m_host.TaskInventory.LockItemsForRead(false);
4163
4164 if (linknum < ScriptBaseClass.LINK_THIS) 4014 if (linknum < ScriptBaseClass.LINK_THIS)
4165 return; 4015 return;
4166 4016
@@ -4259,12 +4109,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4259 { 4109 {
4260 m_host.AddScriptLPS(1); 4110 m_host.AddScriptLPS(1);
4261 4111
4262 UUID invItemID = InventorySelf(); 4112 TaskInventoryItem item = m_item;
4263
4264 TaskInventoryItem item;
4265 m_host.TaskInventory.LockItemsForRead(true);
4266 item = m_host.TaskInventory[invItemID];
4267 m_host.TaskInventory.LockItemsForRead(false);
4268 4113
4269 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 4114 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4270 && !m_automaticLinkPermission) 4115 && !m_automaticLinkPermission)
@@ -4461,11 +4306,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4461 public void llGiveInventory(string destination, string inventory) 4306 public void llGiveInventory(string destination, string inventory)
4462 { 4307 {
4463 m_host.AddScriptLPS(1); 4308 m_host.AddScriptLPS(1);
4464 bool found = false; 4309
4465 UUID destId = UUID.Zero; 4310 UUID destId = UUID.Zero;
4466 UUID objId = UUID.Zero;
4467 int assetType = 0;
4468 string objName = String.Empty;
4469 4311
4470 if (!UUID.TryParse(destination, out destId)) 4312 if (!UUID.TryParse(destination, out destId))
4471 { 4313 {
@@ -4473,28 +4315,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4473 return; 4315 return;
4474 } 4316 }
4475 4317
4476 // move the first object found with this inventory name 4318 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory);
4477 m_host.TaskInventory.LockItemsForRead(true);
4478 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
4479 {
4480 if (inv.Value.Name == inventory)
4481 {
4482 found = true;
4483 objId = inv.Key;
4484 assetType = inv.Value.Type;
4485 objName = inv.Value.Name;
4486 break;
4487 }
4488 }
4489 m_host.TaskInventory.LockItemsForRead(false);
4490 4319
4491 if (!found) 4320 if (item == null)
4492 { 4321 {
4493 llSay(0, String.Format("Could not find object '{0}'", inventory)); 4322 llSay(0, String.Format("Could not find object '{0}'", inventory));
4494 return; 4323 return;
4495// throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory)); 4324// throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory));
4496 } 4325 }
4497 4326
4327 UUID objId = item.ItemID;
4328
4498 // check if destination is an object 4329 // check if destination is an object
4499 if (World.GetSceneObjectPart(destId) != null) 4330 if (World.GetSceneObjectPart(destId) != null)
4500 { 4331 {
@@ -4526,14 +4357,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4526 return; 4357 return;
4527 4358
4528 byte[] bucket = new byte[1]; 4359 byte[] bucket = new byte[1];
4529 bucket[0] = (byte)assetType; 4360 bucket[0] = (byte)item.Type;
4530 //byte[] objBytes = agentItem.ID.GetBytes(); 4361 //byte[] objBytes = agentItem.ID.GetBytes();
4531 //Array.Copy(objBytes, 0, bucket, 1, 16); 4362 //Array.Copy(objBytes, 0, bucket, 1, 16);
4532 4363
4533 GridInstantMessage msg = new GridInstantMessage(World, 4364 GridInstantMessage msg = new GridInstantMessage(World,
4534 m_host.OwnerID, m_host.Name, destId, 4365 m_host.OwnerID, m_host.Name, destId,
4535 (byte)InstantMessageDialog.TaskInventoryOffered, 4366 (byte)InstantMessageDialog.TaskInventoryOffered,
4536 false, objName+". "+m_host.Name+" is located at "+ 4367 false, item.Name+". "+m_host.Name+" is located at "+
4537 World.RegionInfo.RegionName+" "+ 4368 World.RegionInfo.RegionName+" "+
4538 m_host.AbsolutePosition.ToString(), 4369 m_host.AbsolutePosition.ToString(),
4539 agentItem.ID, true, m_host.AbsolutePosition, 4370 agentItem.ID, true, m_host.AbsolutePosition,
@@ -4561,27 +4392,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4561 { 4392 {
4562 m_host.AddScriptLPS(1); 4393 m_host.AddScriptLPS(1);
4563 4394
4564 List<TaskInventoryItem> inv; 4395 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
4565 try 4396
4566 { 4397 if (item == null)
4567 m_host.TaskInventory.LockItemsForRead(true); 4398 return;
4568 inv = new List<TaskInventoryItem>(m_host.TaskInventory.Values); 4399
4569 } 4400 if (item.ItemID == m_item.ItemID)
4570 finally 4401 throw new ScriptDeleteException();
4571 { 4402 else
4572 m_host.TaskInventory.LockItemsForRead(false); 4403 m_host.Inventory.RemoveInventoryItem(item.ItemID);
4573 }
4574 foreach (TaskInventoryItem item in inv)
4575 {
4576 if (item.Name == name)
4577 {
4578 if (item.ItemID == m_itemID)
4579 throw new ScriptDeleteException();
4580 else
4581 m_host.Inventory.RemoveInventoryItem(item.ItemID);
4582 return;
4583 }
4584 }
4585 } 4404 }
4586 4405
4587 public void llSetText(string text, LSL_Vector color, double alpha) 4406 public void llSetText(string text, LSL_Vector color, double alpha)
@@ -4709,8 +4528,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4709 UUID rq = UUID.Random(); 4528 UUID rq = UUID.Random();
4710 4529
4711 UUID tid = AsyncCommands. 4530 UUID tid = AsyncCommands.
4712 DataserverPlugin.RegisterRequest(m_localID, 4531 DataserverPlugin.RegisterRequest(m_host.LocalId,
4713 m_itemID, rq.ToString()); 4532 m_item.ItemID, rq.ToString());
4714 4533
4715 AsyncCommands. 4534 AsyncCommands.
4716 DataserverPlugin.DataserverReply(rq.ToString(), reply); 4535 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -4729,16 +4548,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4729 { 4548 {
4730 m_host.AddScriptLPS(1); 4549 m_host.AddScriptLPS(1);
4731 4550
4732 //Clone is thread safe 4551 foreach (TaskInventoryItem item in m_host.Inventory.GetInventoryItems())
4733 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
4734
4735 foreach (TaskInventoryItem item in itemDictionary.Values)
4736 { 4552 {
4737 if (item.Type == 3 && item.Name == name) 4553 if (item.Type == 3 && item.Name == name)
4738 { 4554 {
4739 UUID tid = AsyncCommands. 4555 UUID tid = AsyncCommands.
4740 DataserverPlugin.RegisterRequest(m_localID, 4556 DataserverPlugin.RegisterRequest(m_host.LocalId,
4741 m_itemID, item.AssetID.ToString()); 4557 m_item.ItemID, item.AssetID.ToString());
4742 4558
4743 Vector3 region = new Vector3( 4559 Vector3 region = new Vector3(
4744 World.RegionInfo.RegionLocX * Constants.RegionSize, 4560 World.RegionInfo.RegionLocX * Constants.RegionSize,
@@ -4764,6 +4580,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4764 return tid.ToString(); 4580 return tid.ToString();
4765 } 4581 }
4766 } 4582 }
4583
4767 ScriptSleep(1000); 4584 ScriptSleep(1000);
4768 return String.Empty; 4585 return String.Empty;
4769 } 4586 }
@@ -4956,19 +4773,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4956 UUID soundId = UUID.Zero; 4773 UUID soundId = UUID.Zero;
4957 if (!UUID.TryParse(impact_sound, out soundId)) 4774 if (!UUID.TryParse(impact_sound, out soundId))
4958 { 4775 {
4959 m_host.TaskInventory.LockItemsForRead(true); 4776 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(impact_sound);
4960 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4777
4961 { 4778 if (item != null && item.Type == (int)AssetType.Sound)
4962 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) 4779 soundId = item.AssetID;
4963 {
4964 soundId = item.AssetID;
4965 break;
4966 }
4967 }
4968 m_host.TaskInventory.LockItemsForRead(false);
4969 } 4780 }
4970 m_host.CollisionSoundVolume = (float)impact_volume; 4781
4971 m_host.CollisionSound = soundId; 4782 m_host.CollisionSound = soundId;
4783 m_host.CollisionSoundVolume = (float)impact_volume;
4972 m_host.CollisionSoundType = 1; 4784 m_host.CollisionSoundType = 1;
4973 } 4785 }
4974 4786
@@ -5010,10 +4822,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5010 UUID partItemID; 4822 UUID partItemID;
5011 foreach (SceneObjectPart part in parts) 4823 foreach (SceneObjectPart part in parts)
5012 { 4824 {
5013 //Clone is thread safe 4825 foreach (TaskInventoryItem item in part.Inventory.GetInventoryItems())
5014 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone();
5015
5016 foreach (TaskInventoryItem item in itemsDictionary.Values)
5017 { 4826 {
5018 if (item.Type == ScriptBaseClass.INVENTORY_SCRIPT) 4827 if (item.Type == ScriptBaseClass.INVENTORY_SCRIPT)
5019 { 4828 {
@@ -5211,22 +5020,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5211 5020
5212 public LSL_String llGetScriptName() 5021 public LSL_String llGetScriptName()
5213 { 5022 {
5214 string result = String.Empty;
5215
5216 m_host.AddScriptLPS(1); 5023 m_host.AddScriptLPS(1);
5217 5024
5218 m_host.TaskInventory.LockItemsForRead(true); 5025 return m_item.Name != null ? m_item.Name : String.Empty;
5219 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
5220 {
5221 if (item.Type == 10 && item.ItemID == m_itemID)
5222 {
5223 result = item.Name!=null?item.Name:String.Empty;
5224 break;
5225 }
5226 }
5227 m_host.TaskInventory.LockItemsForRead(false);
5228
5229 return result;
5230 } 5026 }
5231 5027
5232 public LSL_Integer llGetLinkNumberOfSides(int link) 5028 public LSL_Integer llGetLinkNumberOfSides(int link)
@@ -5397,22 +5193,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5397 { 5193 {
5398 m_host.AddScriptLPS(1); 5194 m_host.AddScriptLPS(1);
5399 5195
5400 m_host.TaskInventory.LockItemsForRead(true); 5196 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
5401 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 5197
5198 if (item == null)
5199 return UUID.Zero.ToString();
5200
5201 if ((item.CurrentPermissions
5202 & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
5203 == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
5402 { 5204 {
5403 if (inv.Value.Name == name) 5205 return item.AssetID.ToString();
5404 {
5405 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
5406 {
5407 m_host.TaskInventory.LockItemsForRead(false);
5408 return inv.Value.AssetID.ToString();
5409 }
5410 else
5411 {
5412 m_host.TaskInventory.LockItemsForRead(false);
5413 return UUID.Zero.ToString();
5414 }
5415 }
5416 } 5206 }
5417 m_host.TaskInventory.LockItemsForRead(false); 5207 m_host.TaskInventory.LockItemsForRead(false);
5418 5208
@@ -6360,7 +6150,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6360 } 6150 }
6361 } 6151 }
6362 } 6152 }
6363 List<UUID> presenceIds = new List<UUID>();
6364 6153
6365 World.ForEachRootScenePresence( 6154 World.ForEachRootScenePresence(
6366 delegate (ScenePresence ssp) 6155 delegate (ScenePresence ssp)
@@ -6511,7 +6300,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6511 if (m_host.OwnerID == land.LandData.OwnerID) 6300 if (m_host.OwnerID == land.LandData.OwnerID)
6512 { 6301 {
6513 Vector3 pos = World.GetNearestAllowedPosition(presence, land); 6302 Vector3 pos = World.GetNearestAllowedPosition(presence, land);
6514 presence.TeleportWithMomentum(pos); 6303 presence.TeleportWithMomentum(pos, null);
6515 presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); 6304 presence.ControllingClient.SendAlertMessage("You have been ejected from this land");
6516 } 6305 }
6517 } 6306 }
@@ -7036,22 +6825,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7036 } 6825 }
7037 } 6826 }
7038 6827
7039 protected UUID GetTaskInventoryItem(string name)
7040 {
7041 m_host.TaskInventory.LockItemsForRead(true);
7042 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
7043 {
7044 if (inv.Value.Name == name)
7045 {
7046 m_host.TaskInventory.LockItemsForRead(false);
7047 return inv.Key;
7048 }
7049 }
7050 m_host.TaskInventory.LockItemsForRead(false);
7051
7052 return UUID.Zero;
7053 }
7054
7055 public void llGiveInventoryList(string destination, string category, LSL_List inventory) 6828 public void llGiveInventoryList(string destination, string category, LSL_List inventory)
7056 { 6829 {
7057 m_host.AddScriptLPS(1); 6830 m_host.AddScriptLPS(1);
@@ -7064,16 +6837,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7064 6837
7065 foreach (Object item in inventory.Data) 6838 foreach (Object item in inventory.Data)
7066 { 6839 {
6840 string rawItemString = item.ToString();
6841
7067 UUID itemID; 6842 UUID itemID;
7068 if (UUID.TryParse(item.ToString(), out itemID)) 6843 if (UUID.TryParse(rawItemString, out itemID))
7069 { 6844 {
7070 itemList.Add(itemID); 6845 itemList.Add(itemID);
7071 } 6846 }
7072 else 6847 else
7073 { 6848 {
7074 itemID = GetTaskInventoryItem(item.ToString()); 6849 TaskInventoryItem taskItem = m_host.Inventory.GetInventoryItem(rawItemString);
7075 if (itemID != UUID.Zero) 6850
7076 itemList.Add(itemID); 6851 if (taskItem != null)
6852 itemList.Add(taskItem.ItemID);
7077 } 6853 }
7078 } 6854 }
7079 6855
@@ -7395,9 +7171,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7395 public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) 7171 public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param)
7396 { 7172 {
7397 m_host.AddScriptLPS(1); 7173 m_host.AddScriptLPS(1);
7398 bool found = false; 7174
7399 UUID destId = UUID.Zero; 7175 UUID destId = UUID.Zero;
7400 UUID srcId = UUID.Zero;
7401 7176
7402 if (!UUID.TryParse(target, out destId)) 7177 if (!UUID.TryParse(target, out destId))
7403 { 7178 {
@@ -7412,25 +7187,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7412 } 7187 }
7413 7188
7414 // copy the first script found with this inventory name 7189 // copy the first script found with this inventory name
7415 TaskInventoryItem scriptItem = null; 7190 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
7416 m_host.TaskInventory.LockItemsForRead(true);
7417 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
7418 {
7419 if (inv.Value.Name == name)
7420 {
7421 // make sure the object is a script
7422 if (10 == inv.Value.Type)
7423 {
7424 found = true;
7425 srcId = inv.Key;
7426 scriptItem = inv.Value;
7427 break;
7428 }
7429 }
7430 }
7431 m_host.TaskInventory.LockItemsForRead(false);
7432 7191
7433 if (!found) 7192 // make sure the object is a script
7193 if (item == null || item.Type != 10)
7434 { 7194 {
7435 llSay(0, "Could not find script " + name); 7195 llSay(0, "Could not find script " + name);
7436 return; 7196 return;
@@ -7439,13 +7199,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7439 SceneObjectPart dest = World.GetSceneObjectPart(destId); 7199 SceneObjectPart dest = World.GetSceneObjectPart(destId);
7440 if (dest != null) 7200 if (dest != null)
7441 { 7201 {
7442 if ((scriptItem.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID) 7202 if ((item.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID)
7443 { 7203 {
7444 // the rest of the permission checks are done in RezScript, so check the pin there as well 7204 // the rest of the permission checks are done in RezScript, so check the pin there as well
7445 World.RezScriptFromPrim(srcId, m_host, destId, pin, running, start_param); 7205 World.RezScriptFromPrim(item.ItemID, m_host, destId, pin, running, start_param);
7446 7206
7447 if ((scriptItem.BasePermissions & (uint)PermissionMask.Copy) == 0) 7207 if ((item.BasePermissions & (uint)PermissionMask.Copy) == 0)
7448 m_host.Inventory.RemoveInventoryItem(srcId); 7208 m_host.Inventory.RemoveInventoryItem(item.ItemID);
7449 } 7209 }
7450 } 7210 }
7451 // this will cause the delay even if the script pin or permissions were wrong - seems ok 7211 // this will cause the delay even if the script pin or permissions were wrong - seems ok
@@ -7458,14 +7218,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7458 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7218 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7459 if (xmlrpcMod.IsEnabled()) 7219 if (xmlrpcMod.IsEnabled())
7460 { 7220 {
7461 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); 7221 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero);
7462 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); 7222 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>();
7463 if (xmlRpcRouter != null) 7223 if (xmlRpcRouter != null)
7464 { 7224 {
7465 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; 7225 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName;
7466 7226
7467 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, 7227 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID,
7468 m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, 7228 m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName,
7469 xmlrpcMod.Port.ToString())); 7229 xmlrpcMod.Port.ToString()));
7470 } 7230 }
7471 object[] resobj = new object[] 7231 object[] resobj = new object[]
@@ -7477,7 +7237,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7477 new LSL_Integer(0), 7237 new LSL_Integer(0),
7478 new LSL_String(String.Empty) 7238 new LSL_String(String.Empty)
7479 }; 7239 };
7480 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, 7240 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj,
7481 new DetectParams[0])); 7241 new DetectParams[0]));
7482 } 7242 }
7483 ScriptSleep(1000); 7243 ScriptSleep(1000);
@@ -7488,7 +7248,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7488 m_host.AddScriptLPS(1); 7248 m_host.AddScriptLPS(1);
7489 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7249 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7490 ScriptSleep(3000); 7250 ScriptSleep(3000);
7491 return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); 7251 return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString();
7492 } 7252 }
7493 7253
7494 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) 7254 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata)
@@ -8475,7 +8235,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8475 return; 8235 return;
8476 face = (int)rules.GetLSLIntegerItem(idx++); 8236 face = (int)rules.GetLSLIntegerItem(idx++);
8477 int shiny = (int)rules.GetLSLIntegerItem(idx++); 8237 int shiny = (int)rules.GetLSLIntegerItem(idx++);
8478 Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); 8238 Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++);
8479 8239
8480 SetShiny(part, face, shiny, bump); 8240 SetShiny(part, face, shiny, bump);
8481 8241
@@ -10317,7 +10077,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10317 public LSL_String llGetSimulatorHostname() 10077 public LSL_String llGetSimulatorHostname()
10318 { 10078 {
10319 m_host.AddScriptLPS(1); 10079 m_host.AddScriptLPS(1);
10320 return System.Environment.MachineName; 10080 IUrlModule UrlModule = World.RequestModuleInterface<IUrlModule>();
10081 return UrlModule.ExternalHostNameForLSL;
10321 } 10082 }
10322 10083
10323 // <summary> 10084 // <summary>
@@ -10554,92 +10315,82 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10554 } 10315 }
10555 } 10316 }
10556 10317
10557 public LSL_Integer llGetInventoryPermMask(string item, int mask) 10318 public LSL_Integer llGetInventoryPermMask(string itemName, int mask)
10558 { 10319 {
10559 m_host.AddScriptLPS(1); 10320 m_host.AddScriptLPS(1);
10560 10321
10561 m_host.TaskInventory.LockItemsForRead(true); 10322 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
10562 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 10323
10324 if (item == null)
10325 return -1;
10326
10327 switch (mask)
10563 { 10328 {
10564 if (inv.Value.Name == item) 10329 case 0:
10565 { 10330 return (int)item.BasePermissions;
10566 m_host.TaskInventory.LockItemsForRead(false); 10331 case 1:
10567 switch (mask) 10332 return (int)item.CurrentPermissions;
10568 { 10333 case 2:
10569 case 0: 10334 return (int)item.GroupPermissions;
10570 return (int)inv.Value.BasePermissions; 10335 case 3:
10571 case 1: 10336 return (int)item.EveryonePermissions;
10572 return (int)inv.Value.CurrentPermissions; 10337 case 4:
10573 case 2: 10338 return (int)item.NextPermissions;
10574 return (int)inv.Value.GroupPermissions;
10575 case 3:
10576 return (int)inv.Value.EveryonePermissions;
10577 case 4:
10578 return (int)inv.Value.NextPermissions;
10579 }
10580 }
10581 } 10339 }
10582 m_host.TaskInventory.LockItemsForRead(false); 10340 m_host.TaskInventory.LockItemsForRead(false);
10583 10341
10584 return -1; 10342 return -1;
10585 } 10343 }
10586 10344
10587 public void llSetInventoryPermMask(string item, int mask, int value) 10345 public void llSetInventoryPermMask(string itemName, int mask, int value)
10588 { 10346 {
10589 m_host.AddScriptLPS(1); 10347 m_host.AddScriptLPS(1);
10348
10590 if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false)) 10349 if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false))
10591 { 10350 {
10592 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) 10351 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
10593 { 10352 {
10594 lock (m_host.TaskInventory) 10353 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
10354
10355 if (item != null)
10595 { 10356 {
10596 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 10357 switch (mask)
10597 { 10358 {
10598 if (inv.Value.Name == item) 10359 case 0:
10599 { 10360 item.BasePermissions = (uint)value;
10600 switch (mask) 10361 break;
10601 { 10362 case 1:
10602 case 0: 10363 item.CurrentPermissions = (uint)value;
10603 inv.Value.BasePermissions = (uint)value; 10364 break;
10604 break; 10365 case 2:
10605 case 1: 10366 item.GroupPermissions = (uint)value;
10606 inv.Value.CurrentPermissions = (uint)value; 10367 break;
10607 break; 10368 case 3:
10608 case 2: 10369 item.EveryonePermissions = (uint)value;
10609 inv.Value.GroupPermissions = (uint)value; 10370 break;
10610 break; 10371 case 4:
10611 case 3: 10372 item.NextPermissions = (uint)value;
10612 inv.Value.EveryonePermissions = (uint)value; 10373 break;
10613 break;
10614 case 4:
10615 inv.Value.NextPermissions = (uint)value;
10616 break;
10617 }
10618 }
10619 } 10374 }
10620 } 10375 }
10621 } 10376 }
10622 } 10377 }
10623 } 10378 }
10624 10379
10625 public LSL_String llGetInventoryCreator(string item) 10380 public LSL_String llGetInventoryCreator(string itemName)
10626 { 10381 {
10627 m_host.AddScriptLPS(1); 10382 m_host.AddScriptLPS(1);
10628 10383
10629 m_host.TaskInventory.LockItemsForRead(true); 10384 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
10630 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 10385
10386 if (item == null)
10631 { 10387 {
10632 if (inv.Value.Name == item) 10388 llSay(0, "No item name '" + item + "'");
10633 {
10634 m_host.TaskInventory.LockItemsForRead(false);
10635 return inv.Value.CreatorID.ToString();
10636 }
10637 }
10638 m_host.TaskInventory.LockItemsForRead(false);
10639 10389
10640 llSay(0, "No item name '" + item + "'"); 10390 return String.Empty;
10391 }
10641 10392
10642 return String.Empty; 10393 return item.CreatorID.ToString();
10643 } 10394 }
10644 10395
10645 public void llOwnerSay(string msg) 10396 public void llOwnerSay(string msg)
@@ -10656,13 +10407,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10656 { 10407 {
10657 m_host.AddScriptLPS(1); 10408 m_host.AddScriptLPS(1);
10658 if (m_UrlModule != null) 10409 if (m_UrlModule != null)
10659 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 10410 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
10660 return UUID.Zero.ToString(); 10411 return UUID.Zero.ToString();
10661 } 10412 }
10662 10413
10663 public LSL_String llRequestSimulatorData(string simulator, int data) 10414 public LSL_String llRequestSimulatorData(string simulator, int data)
10664 { 10415 {
10665 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); 10416 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL");
10666 10417
10667 try 10418 try
10668 { 10419 {
@@ -10672,7 +10423,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10672 10423
10673 GridRegion info; 10424 GridRegion info;
10674 10425
10675 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) 10426 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) //Det data for this simulator?
10427
10676 info = new GridRegion(m_ScriptEngine.World.RegionInfo); 10428 info = new GridRegion(m_ScriptEngine.World.RegionInfo);
10677 else 10429 else
10678 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); 10430 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator);
@@ -10685,10 +10437,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10685 ScriptSleep(1000); 10437 ScriptSleep(1000);
10686 return UUID.Zero.ToString(); 10438 return UUID.Zero.ToString();
10687 } 10439 }
10688 reply = new LSL_Vector( 10440 if (m_ScriptEngine.World.RegionInfo.RegionName != simulator)
10689 info.RegionLocX, 10441 {
10690 info.RegionLocY, 10442 //Hypergrid Region co-ordinates
10691 0).ToString(); 10443 uint rx = 0, ry = 0;
10444 Utils.LongToUInts(Convert.ToUInt64(info.RegionSecret), out rx, out ry);
10445
10446 reply = new LSL_Vector(
10447 rx,
10448 ry,
10449 0).ToString();
10450 }
10451 else
10452 {
10453 //Local-cooridnates
10454 reply = new LSL_Vector(
10455 info.RegionLocX,
10456 info.RegionLocY,
10457 0).ToString();
10458 }
10692 break; 10459 break;
10693 case ScriptBaseClass.DATA_SIM_STATUS: 10460 case ScriptBaseClass.DATA_SIM_STATUS:
10694 if (info != null) 10461 if (info != null)
@@ -10724,7 +10491,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10724 UUID rq = UUID.Random(); 10491 UUID rq = UUID.Random();
10725 10492
10726 UUID tid = AsyncCommands. 10493 UUID tid = AsyncCommands.
10727 DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 10494 DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
10728 10495
10729 AsyncCommands. 10496 AsyncCommands.
10730 DataserverPlugin.DataserverReply(rq.ToString(), reply); 10497 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -10743,7 +10510,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10743 m_host.AddScriptLPS(1); 10510 m_host.AddScriptLPS(1);
10744 10511
10745 if (m_UrlModule != null) 10512 if (m_UrlModule != null)
10746 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 10513 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
10747 return UUID.Zero.ToString(); 10514 return UUID.Zero.ToString();
10748 } 10515 }
10749 10516
@@ -10779,7 +10546,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10779 // child agents have a mass of 1.0 10546 // child agents have a mass of 1.0
10780 return 1; 10547 return 1;
10781 else 10548 else
10782 return avatar.GetMass(); 10549 return (double)avatar.GetMass();
10783 } 10550 }
10784 catch (KeyNotFoundException) 10551 catch (KeyNotFoundException)
10785 { 10552 {
@@ -11183,18 +10950,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11183 { 10950 {
11184 m_host.AddScriptLPS(1); 10951 m_host.AddScriptLPS(1);
11185 10952
11186 m_host.TaskInventory.LockItemsForRead(true); 10953 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
11187 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
11188 {
11189 if (inv.Value.Name == name)
11190 {
11191 m_host.TaskInventory.LockItemsForRead(false);
11192 return inv.Value.Type;
11193 }
11194 }
11195 m_host.TaskInventory.LockItemsForRead(false);
11196 10954
11197 return -1; 10955 if (item == null)
10956 return -1;
10957
10958 return item.Type;
11198 } 10959 }
11199 10960
11200 public void llSetPayPrice(int price, LSL_List quick_pay_buttons) 10961 public void llSetPayPrice(int price, LSL_List quick_pay_buttons)
@@ -11222,32 +10983,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11222 public LSL_Vector llGetCameraPos() 10983 public LSL_Vector llGetCameraPos()
11223 { 10984 {
11224 m_host.AddScriptLPS(1); 10985 m_host.AddScriptLPS(1);
11225 UUID invItemID = InventorySelf();
11226 10986
11227 if (invItemID == UUID.Zero) 10987 if (m_item.PermsGranter == UUID.Zero)
11228 return new LSL_Vector(); 10988 return new LSL_Vector();
11229
11230 m_host.TaskInventory.LockItemsForRead(true);
11231
11232 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter;
11233
11234// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
11235 if (agentID == UUID.Zero)
11236 {
11237 m_host.TaskInventory.LockItemsForRead(false);
11238 return new LSL_Vector();
11239 }
11240 10989
11241 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 10990 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
11242 { 10991 {
11243 ShoutError("No permissions to track the camera"); 10992 ShoutError("No permissions to track the camera");
11244 m_host.TaskInventory.LockItemsForRead(false);
11245 return new LSL_Vector(); 10993 return new LSL_Vector();
11246 } 10994 }
11247 m_host.TaskInventory.LockItemsForRead(false);
11248 10995
11249// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10996// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
11250 ScenePresence presence = World.GetScenePresence(agentID); 10997 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
11251 if (presence != null) 10998 if (presence != null)
11252 { 10999 {
11253 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); 11000 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z);
@@ -11259,30 +11006,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11259 public LSL_Rotation llGetCameraRot() 11006 public LSL_Rotation llGetCameraRot()
11260 { 11007 {
11261 m_host.AddScriptLPS(1); 11008 m_host.AddScriptLPS(1);
11262 UUID invItemID = InventorySelf();
11263 if (invItemID == UUID.Zero)
11264 return new LSL_Rotation();
11265
11266 m_host.TaskInventory.LockItemsForRead(true);
11267 11009
11268 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter; 11010 if (m_item.PermsGranter == UUID.Zero)
11011 return new LSL_Rotation();
11269 11012
11270// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 11013 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
11271 if (agentID == UUID.Zero)
11272 {
11273 m_host.TaskInventory.LockItemsForRead(false);
11274 return new LSL_Rotation();
11275 }
11276 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
11277 { 11014 {
11278 ShoutError("No permissions to track the camera"); 11015 ShoutError("No permissions to track the camera");
11279 m_host.TaskInventory.LockItemsForRead(false);
11280 return new LSL_Rotation(); 11016 return new LSL_Rotation();
11281 } 11017 }
11282 m_host.TaskInventory.LockItemsForRead(false);
11283 11018
11284// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 11019// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
11285 ScenePresence presence = World.GetScenePresence(agentID); 11020 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
11286 if (presence != null) 11021 if (presence != null)
11287 { 11022 {
11288 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); 11023 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W);
@@ -11341,7 +11076,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11341 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) 11076 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt)
11342 { 11077 {
11343 m_host.AddScriptLPS(1); 11078 m_host.AddScriptLPS(1);
11344 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); 11079 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0);
11345 if (detectedParams == null) 11080 if (detectedParams == null)
11346 { 11081 {
11347 if (m_host.ParentGroup.IsAttachment == true) 11082 if (m_host.ParentGroup.IsAttachment == true)
@@ -11465,30 +11200,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11465 { 11200 {
11466 m_host.AddScriptLPS(1); 11201 m_host.AddScriptLPS(1);
11467 11202
11468 // our key in the object we are in
11469 UUID invItemID = InventorySelf();
11470 if (invItemID == UUID.Zero) return;
11471
11472 // the object we are in 11203 // the object we are in
11473 UUID objectID = m_host.ParentUUID; 11204 UUID objectID = m_host.ParentUUID;
11474 if (objectID == UUID.Zero) return; 11205 if (objectID == UUID.Zero)
11206 return;
11475 11207
11476 UUID agentID;
11477 m_host.TaskInventory.LockItemsForRead(true);
11478 // we need the permission first, to know which avatar we want to set the camera for 11208 // we need the permission first, to know which avatar we want to set the camera for
11479 agentID = m_host.TaskInventory[invItemID].PermsGranter; 11209 UUID agentID = m_item.PermsGranter;
11480 11210
11481 if (agentID == UUID.Zero) 11211 if (agentID == UUID.Zero)
11482 {
11483 m_host.TaskInventory.LockItemsForRead(false);
11484 return; 11212 return;
11485 } 11213
11486 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 11214 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
11487 {
11488 m_host.TaskInventory.LockItemsForRead(false);
11489 return; 11215 return;
11490 }
11491 m_host.TaskInventory.LockItemsForRead(false);
11492 11216
11493 ScenePresence presence = World.GetScenePresence(agentID); 11217 ScenePresence presence = World.GetScenePresence(agentID);
11494 11218
@@ -11530,34 +11254,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11530 { 11254 {
11531 m_host.AddScriptLPS(1); 11255 m_host.AddScriptLPS(1);
11532 11256
11533 // our key in the object we are in
11534 UUID invItemID=InventorySelf();
11535 if (invItemID == UUID.Zero) return;
11536
11537 // the object we are in 11257 // the object we are in
11538 UUID objectID = m_host.ParentUUID; 11258 UUID objectID = m_host.ParentUUID;
11539 if (objectID == UUID.Zero) return; 11259 if (objectID == UUID.Zero)
11260 return;
11540 11261
11541 // we need the permission first, to know which avatar we want to clear the camera for 11262 // we need the permission first, to know which avatar we want to clear the camera for
11542 UUID agentID; 11263 UUID agentID = m_item.PermsGranter;
11543 m_host.TaskInventory.LockItemsForRead(true); 11264
11544 agentID = m_host.TaskInventory[invItemID].PermsGranter;
11545 if (agentID == UUID.Zero) 11265 if (agentID == UUID.Zero)
11546 {
11547 m_host.TaskInventory.LockItemsForRead(false);
11548 return; 11266 return;
11549 } 11267
11550 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 11268 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
11551 {
11552 m_host.TaskInventory.LockItemsForRead(false);
11553 return; 11269 return;
11554 }
11555 m_host.TaskInventory.LockItemsForRead(false);
11556 11270
11557 ScenePresence presence = World.GetScenePresence(agentID); 11271 ScenePresence presence = World.GetScenePresence(agentID);
11558 11272
11559 // we are not interested in child-agents 11273 // we are not interested in child-agents
11560 if (presence.IsChildAgent) return; 11274 if (presence.IsChildAgent)
11275 return;
11561 11276
11562 presence.ControllingClient.SendClearFollowCamProperties(objectID); 11277 presence.ControllingClient.SendClearFollowCamProperties(objectID);
11563 } 11278 }
@@ -11748,8 +11463,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11748 } 11463 }
11749 } 11464 }
11750 11465
11751 UUID reqID = httpScriptMod. 11466 UUID reqID
11752 StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); 11467 = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body);
11753 11468
11754 if (reqID != UUID.Zero) 11469 if (reqID != UUID.Zero)
11755 return reqID.ToString(); 11470 return reqID.ToString();
@@ -12003,19 +11718,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12003 break; 11718 break;
12004 // For the following 8 see the Object version below 11719 // For the following 8 see the Object version below
12005 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11720 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
12006 ret.Add(new LSL_Integer(0)); 11721 ret.Add(new LSL_Integer(av.RunningScriptCount()));
12007 break; 11722 break;
12008 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11723 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
12009 ret.Add(new LSL_Integer(0)); 11724 ret.Add(new LSL_Integer(av.ScriptCount()));
12010 break; 11725 break;
12011 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11726 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
12012 ret.Add(new LSL_Integer(0)); 11727 ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384));
12013 break; 11728 break;
12014 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11729 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
12015 ret.Add(new LSL_Float(0)); 11730 ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f));
12016 break; 11731 break;
12017 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11732 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
12018 ret.Add(new LSL_Integer(0)); 11733 ret.Add(new LSL_Integer(1));
12019 break; 11734 break;
12020 case ScriptBaseClass.OBJECT_SERVER_COST: 11735 case ScriptBaseClass.OBJECT_SERVER_COST:
12021 ret.Add(new LSL_Float(0)); 11736 ret.Add(new LSL_Float(0));
@@ -12073,37 +11788,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12073 case ScriptBaseClass.OBJECT_CREATOR: 11788 case ScriptBaseClass.OBJECT_CREATOR:
12074 ret.Add(new LSL_String(obj.CreatorID.ToString())); 11789 ret.Add(new LSL_String(obj.CreatorID.ToString()));
12075 break; 11790 break;
12076 // The following 8 I have intentionaly coded to return zero. They are part of
12077 // "Land Impact" calculations. These calculations are probably not applicable
12078 // to OpenSim, required figures (cpu/memory usage) are not currently tracked
12079 // I have intentionally left these all at zero rather than return possibly
12080 // missleading numbers
12081 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11791 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
12082 // in SL this currently includes crashed scripts 11792 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount()));
12083 ret.Add(new LSL_Integer(0));
12084 break; 11793 break;
12085 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11794 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
12086 ret.Add(new LSL_Integer(0)); 11795 ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount()));
12087 break; 11796 break;
12088 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11797 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
12089 // The value returned in SL for mono scripts is 65536 * number of active scripts 11798 // The value returned in SL for mono scripts is 65536 * number of active scripts
12090 ret.Add(new LSL_Integer(0)); 11799 // and 16384 * number of active scripts for LSO. since llGetFreememory
11800 // is coded to give the LSO value use it here
11801 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384));
12091 break; 11802 break;
12092 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11803 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
12093 // Average cpu time per simulator frame expended on all scripts in the objetc 11804 // Average cpu time in seconds per simulator frame expended on all scripts in the object
12094 ret.Add(new LSL_Float(0)); 11805 ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f));
12095 break; 11806 break;
12096 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11807 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
12097 // according to the SL wiki A prim or linkset will have prim 11808 // according to the SL wiki A prim or linkset will have prim
12098 // equivalent of the number of prims in a linkset if it does not 11809 // equivalent of the number of prims in a linkset if it does not
12099 // contain a mesh anywhere in the link set or is not a normal prim 11810 // contain a mesh anywhere in the link set or is not a normal prim
12100 // The value returned in SL for normal prims is prim count 11811 // The value returned in SL for normal prims is prim count
12101 ret.Add(new LSL_Integer(0)); 11812 ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount));
12102 break; 11813 break;
12103 11814
12104 // costs below may need to be diferent for root parts, need to check 11815 // costs below may need to be diferent for root parts, need to check
12105 case ScriptBaseClass.OBJECT_SERVER_COST: 11816 case ScriptBaseClass.OBJECT_SERVER_COST:
12106 // The value returned in SL for normal prims is prim count 11817 // The linden calculation is here
11818 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight
11819 // The value returned in SL for normal prims looks like the prim count
12107 ret.Add(new LSL_Float(0)); 11820 ret.Add(new LSL_Float(0));
12108 break; 11821 break;
12109 case ScriptBaseClass.OBJECT_STREAMING_COST: 11822 case ScriptBaseClass.OBJECT_STREAMING_COST:
@@ -12128,22 +11841,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12128 return new LSL_List(); 11841 return new LSL_List();
12129 } 11842 }
12130 11843
12131 internal UUID ScriptByName(string name) 11844 internal UUID GetScriptByName(string name)
12132 { 11845 {
12133 m_host.TaskInventory.LockItemsForRead(true); 11846 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
12134 11847
12135 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 11848 if (item == null || item.Type != 10)
12136 { 11849 return UUID.Zero;
12137 if (item.Type == 10 && item.Name == name)
12138 {
12139 m_host.TaskInventory.LockItemsForRead(false);
12140 return item.ItemID;
12141 }
12142 }
12143
12144 m_host.TaskInventory.LockItemsForRead(false);
12145 11850
12146 return UUID.Zero; 11851 return item.ItemID;
12147 } 11852 }
12148 11853
12149 internal void ShoutError(string msg) 11854 internal void ShoutError(string msg)
@@ -12183,21 +11888,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12183 { 11888 {
12184 m_host.AddScriptLPS(1); 11889 m_host.AddScriptLPS(1);
12185 11890
12186 //Clone is thread safe
12187 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
12188
12189 UUID assetID = UUID.Zero; 11891 UUID assetID = UUID.Zero;
12190 11892
12191 if (!UUID.TryParse(name, out assetID)) 11893 if (!UUID.TryParse(name, out assetID))
12192 { 11894 {
12193 foreach (TaskInventoryItem item in itemsDictionary.Values) 11895 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
12194 { 11896
12195 if (item.Type == 7 && item.Name == name) 11897 if (item != null && item.Type == 7)
12196 { 11898 assetID = item.AssetID;
12197 assetID = item.AssetID;
12198 break;
12199 }
12200 }
12201 } 11899 }
12202 11900
12203 if (assetID == UUID.Zero) 11901 if (assetID == UUID.Zero)
@@ -12209,7 +11907,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12209 } 11907 }
12210 11908
12211 // was: UUID tid = tid = AsyncCommands. 11909 // was: UUID tid = tid = AsyncCommands.
12212 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11910 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
12213 11911
12214 if (NotecardCache.IsCached(assetID)) 11912 if (NotecardCache.IsCached(assetID))
12215 { 11913 {
@@ -12228,9 +11926,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12228 return; 11926 return;
12229 } 11927 }
12230 11928
12231 System.Text.UTF8Encoding enc = 11929 string data = Encoding.UTF8.GetString(a.Data);
12232 new System.Text.UTF8Encoding();
12233 string data = enc.GetString(a.Data);
12234 //m_log.Debug(data); 11930 //m_log.Debug(data);
12235 NotecardCache.Cache(id, data); 11931 NotecardCache.Cache(id, data);
12236 AsyncCommands. 11932 AsyncCommands.
@@ -12246,21 +11942,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12246 { 11942 {
12247 m_host.AddScriptLPS(1); 11943 m_host.AddScriptLPS(1);
12248 11944
12249 //Clone is thread safe
12250 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
12251
12252 UUID assetID = UUID.Zero; 11945 UUID assetID = UUID.Zero;
12253 11946
12254 if (!UUID.TryParse(name, out assetID)) 11947 if (!UUID.TryParse(name, out assetID))
12255 { 11948 {
12256 foreach (TaskInventoryItem item in itemsDictionary.Values) 11949 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
12257 { 11950
12258 if (item.Type == 7 && item.Name == name) 11951 if (item != null && item.Type == 7)
12259 { 11952 assetID = item.AssetID;
12260 assetID = item.AssetID;
12261 break;
12262 }
12263 }
12264 } 11953 }
12265 11954
12266 if (assetID == UUID.Zero) 11955 if (assetID == UUID.Zero)
@@ -12272,7 +11961,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12272 } 11961 }
12273 11962
12274 // was: UUID tid = tid = AsyncCommands. 11963 // was: UUID tid = tid = AsyncCommands.
12275 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11964 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
12276 11965
12277 if (NotecardCache.IsCached(assetID)) 11966 if (NotecardCache.IsCached(assetID))
12278 { 11967 {
@@ -12290,9 +11979,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12290 return; 11979 return;
12291 } 11980 }
12292 11981
12293 System.Text.UTF8Encoding enc = 11982 string data = Encoding.UTF8.GetString(a.Data);
12294 new System.Text.UTF8Encoding();
12295 string data = enc.GetString(a.Data);
12296 //m_log.Debug(data); 11983 //m_log.Debug(data);
12297 NotecardCache.Cache(id, data); 11984 NotecardCache.Cache(id, data);
12298 AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(), 11985 AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(),
@@ -12356,7 +12043,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12356 { 12043 {
12357 UUID rq = UUID.Random(); 12044 UUID rq = UUID.Random();
12358 12045
12359 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 12046 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
12360 12047
12361 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); 12048 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id)));
12362 12049
@@ -12372,7 +12059,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12372 { 12059 {
12373 UUID rq = UUID.Random(); 12060 UUID rq = UUID.Random();
12374 12061
12375 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 12062 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
12376 12063
12377 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); 12064 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id));
12378 12065
@@ -12574,7 +12261,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12574 { 12261 {
12575 Tri t1 = new Tri(); 12262 Tri t1 = new Tri();
12576 Tri t2 = new Tri(); 12263 Tri t2 = new Tri();
12577 12264
12578 Vector3 p1 = new Vector3(x-1, y-1, (float)heightfield[x-1, y-1]); 12265 Vector3 p1 = new Vector3(x-1, y-1, (float)heightfield[x-1, y-1]);
12579 Vector3 p2 = new Vector3(x, y-1, (float)heightfield[x, y-1]); 12266 Vector3 p2 = new Vector3(x, y-1, (float)heightfield[x, y-1]);
12580 Vector3 p3 = new Vector3(x, y, (float)heightfield[x, y]); 12267 Vector3 p3 = new Vector3(x, y, (float)heightfield[x, y]);
@@ -12615,7 +12302,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12615 // sometimes 12302 // sometimes
12616 if (Math.Abs(b) < 0.000001) 12303 if (Math.Abs(b) < 0.000001)
12617 continue; 12304 continue;
12618 12305
12619 double r = a / b; 12306 double r = a / b;
12620 12307
12621 // ray points away from plane 12308 // ray points away from plane
@@ -12875,7 +12562,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12875 bool isAccount = false; 12562 bool isAccount = false;
12876 bool isGroup = false; 12563 bool isGroup = false;
12877 12564
12878 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) 12565 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID))
12879 return 0; 12566 return 0;
12880 12567
12881 UUID id = new UUID(); 12568 UUID id = new UUID();
@@ -12937,35 +12624,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12937 return 1; 12624 return 1;
12938 } 12625 }
12939 12626
12940 #region Not Implemented 12627 public LSL_Integer llGetMemoryLimit()
12941 // 12628 {
12942 // Listing the unimplemented lsl functions here, please move 12629 m_host.AddScriptLPS(1);
12943 // them from this region as they are completed 12630 // The value returned for LSO scripts in SL
12944 // 12631 return 16384;
12632 }
12945 12633
12946 public void llGetEnv(LSL_String name) 12634 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
12947 { 12635 {
12948 m_host.AddScriptLPS(1); 12636 m_host.AddScriptLPS(1);
12949 NotImplemented("llGetEnv"); 12637 // Treat as an LSO script
12638 return ScriptBaseClass.FALSE;
12950 } 12639 }
12951 12640
12952 public void llGetSPMaxMemory() 12641 public LSL_Integer llGetSPMaxMemory()
12953 { 12642 {
12954 m_host.AddScriptLPS(1); 12643 m_host.AddScriptLPS(1);
12955 NotImplemented("llGetSPMaxMemory"); 12644 // The value returned for LSO scripts in SL
12645 return 16384;
12956 } 12646 }
12957 12647
12958 public virtual LSL_Integer llGetUsedMemory() 12648 public virtual LSL_Integer llGetUsedMemory()
12959 { 12649 {
12960 m_host.AddScriptLPS(1); 12650 m_host.AddScriptLPS(1);
12961 NotImplemented("llGetUsedMemory"); 12651 // The value returned for LSO scripts in SL
12962 return 0; 12652 return 16384;
12963 } 12653 }
12964 12654
12965 public void llScriptProfiler(LSL_Integer flags) 12655 public void llScriptProfiler(LSL_Integer flags)
12966 { 12656 {
12967 m_host.AddScriptLPS(1); 12657 m_host.AddScriptLPS(1);
12968 //NotImplemented("llScriptProfiler"); 12658 // This does nothing for LSO scripts in SL
12659 }
12660
12661 #region Not Implemented
12662 //
12663 // Listing the unimplemented lsl functions here, please move
12664 // them from this region as they are completed
12665 //
12666
12667 public void llGetEnv(LSL_String name)
12668 {
12669 m_host.AddScriptLPS(1);
12670 NotImplemented("llGetEnv");
12969 } 12671 }
12970 12672
12971 public void llSetSoundQueueing(int queue) 12673 public void llSetSoundQueueing(int queue)
@@ -13045,8 +12747,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13045 12747
13046 try 12748 try
13047 { 12749 {
13048 UUID invItemID=InventorySelf(); 12750 TaskInventoryItem item = m_item;
13049 if (invItemID == UUID.Zero) 12751 if (item == null)
13050 { 12752 {
13051 replydata = "SERVICE_ERROR"; 12753 replydata = "SERVICE_ERROR";
13052 return; 12754 return;
@@ -13054,10 +12756,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13054 12756
13055 m_host.AddScriptLPS(1); 12757 m_host.AddScriptLPS(1);
13056 12758
13057 m_host.TaskInventory.LockItemsForRead(true);
13058 TaskInventoryItem item = m_host.TaskInventory[invItemID];
13059 m_host.TaskInventory.LockItemsForRead(false);
13060
13061 if (item.PermsGranter == UUID.Zero) 12759 if (item.PermsGranter == UUID.Zero)
13062 { 12760 {
13063 replydata = "MISSING_PERMISSION_DEBIT"; 12761 replydata = "MISSING_PERMISSION_DEBIT";
@@ -13099,7 +12797,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13099 } 12797 }
13100 finally 12798 finally
13101 { 12799 {
13102 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 12800 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
13103 "transaction_result", new Object[] { 12801 "transaction_result", new Object[] {
13104 new LSL_String(txn.ToString()), 12802 new LSL_String(txn.ToString()),
13105 new LSL_Integer(replycode), 12803 new LSL_Integer(replycode),
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
index 77a784d..795de80 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
@@ -58,17 +58,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
58 { 58 {
59 internal IScriptEngine m_ScriptEngine; 59 internal IScriptEngine m_ScriptEngine;
60 internal SceneObjectPart m_host; 60 internal SceneObjectPart m_host;
61 internal uint m_localID;
62 internal UUID m_itemID;
63 internal bool m_LSFunctionsEnabled = false; 61 internal bool m_LSFunctionsEnabled = false;
64 internal IScriptModuleComms m_comms = null; 62 internal IScriptModuleComms m_comms = null;
65 63
66 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 64 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
67 { 65 {
68 m_ScriptEngine = ScriptEngine; 66 m_ScriptEngine = ScriptEngine;
69 m_host = host; 67 m_host = host;
70 m_localID = localID;
71 m_itemID = itemID;
72 68
73 if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) 69 if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false))
74 m_LSFunctionsEnabled = true; 70 m_LSFunctionsEnabled = true;
@@ -449,7 +445,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
449 LSShoutError("LightShare functions are not enabled."); 445 LSShoutError("LightShare functions are not enabled.");
450 return 0; 446 return 0;
451 } 447 }
452 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) 448 if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
453 { 449 {
454 LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); 450 LSShoutError("lsSetWindlightScene can only be used by estate managers or owners.");
455 return 0; 451 return 0;
@@ -477,7 +473,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
477 LSShoutError("LightShare functions are not enabled."); 473 LSShoutError("LightShare functions are not enabled.");
478 return; 474 return;
479 } 475 }
480 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) 476 if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
481 { 477 {
482 LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); 478 LSShoutError("lsSetWindlightScene can only be used by estate managers or owners.");
483 return; 479 return;
@@ -500,7 +496,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
500 LSShoutError("LightShare functions are not enabled."); 496 LSShoutError("LightShare functions are not enabled.");
501 return 0; 497 return 0;
502 } 498 }
503 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) 499 if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
504 { 500 {
505 LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); 501 LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners.");
506 return 0; 502 return 0;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index 7c07e15..4bd3dff 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -57,17 +57,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
57 { 57 {
58 internal IScriptEngine m_ScriptEngine; 58 internal IScriptEngine m_ScriptEngine;
59 internal SceneObjectPart m_host; 59 internal SceneObjectPart m_host;
60 internal uint m_localID; 60 internal TaskInventoryItem m_item;
61 internal UUID m_itemID;
62 internal bool m_MODFunctionsEnabled = false; 61 internal bool m_MODFunctionsEnabled = false;
63 internal IScriptModuleComms m_comms = null; 62 internal IScriptModuleComms m_comms = null;
64 63
65 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 64 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
66 { 65 {
67 m_ScriptEngine = ScriptEngine; 66 m_ScriptEngine = ScriptEngine;
68 m_host = host; 67 m_host = host;
69 m_localID = localID; 68 m_item = item;
70 m_itemID = itemID;
71 69
72 if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false)) 70 if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false))
73 m_MODFunctionsEnabled = true; 71 m_MODFunctionsEnabled = true;
@@ -252,7 +250,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
252 // non-null but don't trust it completely 250 // non-null but don't trust it completely
253 try 251 try
254 { 252 {
255 object result = m_comms.InvokeOperation(m_host.UUID, m_itemID, fname, convertedParms); 253 object result = m_comms.InvokeOperation(m_host.UUID, m_item.ItemID, fname, convertedParms);
256 if (result != null) 254 if (result != null)
257 return result; 255 return result;
258 256
@@ -279,7 +277,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
279 277
280 UUID req = UUID.Random(); 278 UUID req = UUID.Random();
281 279
282 m_comms.RaiseEvent(m_itemID, req.ToString(), module, command, k); 280 m_comms.RaiseEvent(m_item.ItemID, req.ToString(), module, command, k);
283 281
284 return req.ToString(); 282 return req.ToString();
285 } 283 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 0dc2aa2..29d0342 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -126,13 +126,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
126 [Serializable] 126 [Serializable]
127 public class OSSL_Api : MarshalByRefObject, IOSSL_Api, IScriptApi 127 public class OSSL_Api : MarshalByRefObject, IOSSL_Api, IScriptApi
128 { 128 {
129// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 129 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
130
131 public const string GridInfoServiceConfigSectionName = "GridInfoService";
130 132
131 internal IScriptEngine m_ScriptEngine; 133 internal IScriptEngine m_ScriptEngine;
132 internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there 134 internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there
133 internal SceneObjectPart m_host; 135 internal SceneObjectPart m_host;
134 internal uint m_localID; 136 internal TaskInventoryItem m_item;
135 internal UUID m_itemID;
136 internal bool m_OSFunctionsEnabled = false; 137 internal bool m_OSFunctionsEnabled = false;
137 internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; 138 internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow;
138 internal float m_ScriptDelayFactor = 1.0f; 139 internal float m_ScriptDelayFactor = 1.0f;
@@ -140,12 +141,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
140 internal bool m_debuggerSafe = false; 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 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 144 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
144 { 145 {
145 m_ScriptEngine = ScriptEngine; 146 m_ScriptEngine = ScriptEngine;
146 m_host = host; 147 m_host = host;
147 m_localID = localID; 148 m_item = item;
148 m_itemID = itemID;
149 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 149 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
150 150
151 if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) 151 if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false))
@@ -218,12 +218,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
218 } 218 }
219 } 219 }
220 220
221 /// <summary>
222 /// Initialize the LSL interface.
223 /// </summary>
224 /// <remarks>
225 /// FIXME: This is an abomination. We should be able to set this up earlier but currently we have no
226 /// guarantee the interface is present on Initialize(). There needs to be another post initialize call from
227 /// ScriptInstance.
228 /// </remarks>
221 private void InitLSL() 229 private void InitLSL()
222 { 230 {
223 if (m_LSL_Api != null) 231 if (m_LSL_Api != null)
224 return; 232 return;
225 233
226 m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_itemID, "LSL"); 234 m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "LSL");
227 } 235 }
228 236
229 // 237 //
@@ -342,22 +350,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
342 return; 350 return;
343 } 351 }
344 352
345 TaskInventoryItem ti = m_host.Inventory.GetInventoryItem(m_itemID); 353 UUID ownerID = m_item.OwnerID;
346 if (ti == null)
347 {
348 OSSLError(
349 String.Format("{0} permission error. Can't find script in prim inventory.",
350 function));
351 }
352
353 UUID ownerID = ti.OwnerID;
354 354
355 //OSSL only may be used if objet is in the same group as the parcel 355 //OSSL only may be used if object is in the same group as the parcel
356 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) 356 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER"))
357 { 357 {
358 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 358 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
359 359
360 if (land.LandData.GroupID == ti.GroupID && land.LandData.GroupID != UUID.Zero) 360 if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero)
361 { 361 {
362 return; 362 return;
363 } 363 }
@@ -378,7 +378,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
378 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER")) 378 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER"))
379 { 379 {
380 //Only Estate Managers may use the function 380 //Only Estate Managers may use the function
381 if (World.RegionInfo.EstateSettings.IsEstateManager(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) 381 if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID)
382 { 382 {
383 return; 383 return;
384 } 384 }
@@ -393,13 +393,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
393 } 393 }
394 } 394 }
395 395
396 if (!m_FunctionPerms[function].AllowedCreators.Contains(ti.CreatorID)) 396 if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID))
397 OSSLError( 397 OSSLError(
398 String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", 398 String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.",
399 function)); 399 function));
400 if (ti.CreatorID != ownerID) 400
401 if (m_item.CreatorID != ownerID)
401 { 402 {
402 if ((ti.CurrentPermissions & (uint)PermissionMask.Modify) != 0) 403 if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0)
403 OSSLError( 404 OSSLError(
404 String.Format("{0} permission denied. Script permissions error.", 405 String.Format("{0} permission denied. Script permissions error.",
405 function)); 406 function));
@@ -730,11 +731,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
730 731
731 m_host.AddScriptLPS(1); 732 m_host.AddScriptLPS(1);
732 733
734 // For safety, we add another permission check here, and don't rely only on the standard OSSL permissions
733 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) 735 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
734 { 736 {
735 MainConsole.Instance.RunCommand(command); 737 MainConsole.Instance.RunCommand(command);
736 return true; 738 return true;
737 } 739 }
740
738 return false; 741 return false;
739 } 742 }
740 743
@@ -880,13 +883,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
880 if (World.Entities.ContainsKey((UUID)agent) && World.Entities[avatarID] is ScenePresence) 883 if (World.Entities.ContainsKey((UUID)agent) && World.Entities[avatarID] is ScenePresence)
881 { 884 {
882 ScenePresence target = (ScenePresence)World.Entities[avatarID]; 885 ScenePresence target = (ScenePresence)World.Entities[avatarID];
883 EndPoint ep = target.ControllingClient.GetClientEP(); 886 return target.ControllingClient.RemoteEndPoint.Address.ToString();
884 if (ep is IPEndPoint)
885 {
886 IPEndPoint ip = (IPEndPoint)ep;
887 return ip.Address.ToString();
888 }
889 } 887 }
888
890 // fall through case, just return nothing 889 // fall through case, just return nothing
891 return ""; 890 return "";
892 } 891 }
@@ -957,21 +956,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
957 UUID avatarID = (UUID)avatar; 956 UUID avatarID = (UUID)avatar;
958 957
959 m_host.AddScriptLPS(1); 958 m_host.AddScriptLPS(1);
959
960 // FIXME: What we really want to do here is factor out the similar code in llStopAnimation() to a common
961 // method (though see that doesn't do the is animation check, which is probably a bug) and have both
962 // these functions call that common code. However, this does mean navigating the brain-dead requirement
963 // of calling InitLSL()
960 if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) 964 if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence)
961 { 965 {
962 ScenePresence target = (ScenePresence)World.Entities[avatarID]; 966 ScenePresence target = (ScenePresence)World.Entities[avatarID];
963 if (target != null) 967 if (target != null)
964 { 968 {
965 UUID animID = UUID.Zero; 969 UUID animID;
966 m_host.TaskInventory.LockItemsForRead(true); 970
967 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 971 if (!UUID.TryParse(animation, out animID))
968 { 972 {
969 if (inv.Value.Name == animation) 973 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(animation);
970 { 974 if (item != null && item.Type == (int)AssetType.Animation)
971 if (inv.Value.Type == (int)AssetType.Animation) 975 animID = item.AssetID;
972 animID = inv.Value.AssetID; 976 else
973 continue; 977 animID = UUID.Zero;
974 }
975 } 978 }
976 m_host.TaskInventory.LockItemsForRead(false); 979 m_host.TaskInventory.LockItemsForRead(false);
977 980
@@ -1178,7 +1181,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1178 CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); 1181 CheckThreatLevel(ThreatLevel.High, "osSetStateEvents");
1179 m_host.AddScriptLPS(1); 1182 m_host.AddScriptLPS(1);
1180 1183
1181 m_host.SetScriptEvents(m_itemID, events); 1184 m_host.SetScriptEvents(m_item.ItemID, events);
1182 } 1185 }
1183 1186
1184 public void osSetRegionWaterHeight(double height) 1187 public void osSetRegionWaterHeight(double height)
@@ -1186,12 +1189,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1186 CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); 1189 CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight");
1187 1190
1188 m_host.AddScriptLPS(1); 1191 m_host.AddScriptLPS(1);
1189 //Check to make sure that the script's owner is the estate manager/master 1192
1190 //World.Permissions.GenericEstatePermission( 1193 World.EventManager.TriggerRequestChangeWaterHeight((float)height);
1191 if (World.Permissions.IsGod(m_host.OwnerID))
1192 {
1193 World.EventManager.TriggerRequestChangeWaterHeight((float)height);
1194 }
1195 } 1194 }
1196 1195
1197 /// <summary> 1196 /// <summary>
@@ -1202,27 +1201,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1202 /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> 1201 /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param>
1203 public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour) 1202 public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour)
1204 { 1203 {
1205 CheckThreatLevel(ThreatLevel.Nuisance, "osSetRegionSunSettings"); 1204 CheckThreatLevel(ThreatLevel.High, "osSetRegionSunSettings");
1206 1205
1207 m_host.AddScriptLPS(1); 1206 m_host.AddScriptLPS(1);
1208 //Check to make sure that the script's owner is the estate manager/master
1209 //World.Permissions.GenericEstatePermission(
1210 if (World.Permissions.IsGod(m_host.OwnerID))
1211 {
1212 while (sunHour > 24.0)
1213 sunHour -= 24.0;
1214 1207
1215 while (sunHour < 0) 1208 while (sunHour > 24.0)
1216 sunHour += 24.0; 1209 sunHour -= 24.0;
1217 1210
1211 while (sunHour < 0)
1212 sunHour += 24.0;
1218 1213
1219 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; 1214 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun;
1220 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 1215 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30
1221 World.RegionInfo.RegionSettings.FixedSun = sunFixed; 1216 World.RegionInfo.RegionSettings.FixedSun = sunFixed;
1222 World.RegionInfo.RegionSettings.Save(); 1217 World.RegionInfo.RegionSettings.Save();
1223 1218
1224 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); 1219 World.EventManager.TriggerEstateToolsSunUpdate(
1225 } 1220 World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour);
1226 } 1221 }
1227 1222
1228 /// <summary> 1223 /// <summary>
@@ -1232,26 +1227,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1232 /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> 1227 /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param>
1233 public void osSetEstateSunSettings(bool sunFixed, double sunHour) 1228 public void osSetEstateSunSettings(bool sunFixed, double sunHour)
1234 { 1229 {
1235 CheckThreatLevel(ThreatLevel.Nuisance, "osSetEstateSunSettings"); 1230 CheckThreatLevel(ThreatLevel.High, "osSetEstateSunSettings");
1236 1231
1237 m_host.AddScriptLPS(1); 1232 m_host.AddScriptLPS(1);
1238 //Check to make sure that the script's owner is the estate manager/master
1239 //World.Permissions.GenericEstatePermission(
1240 if (World.Permissions.IsGod(m_host.OwnerID))
1241 {
1242 while (sunHour > 24.0)
1243 sunHour -= 24.0;
1244 1233
1245 while (sunHour < 0) 1234 while (sunHour > 24.0)
1246 sunHour += 24.0; 1235 sunHour -= 24.0;
1247 1236
1248 World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; 1237 while (sunHour < 0)
1249 World.RegionInfo.EstateSettings.SunPosition = sunHour; 1238 sunHour += 24.0;
1250 World.RegionInfo.EstateSettings.FixedSun = sunFixed;
1251 World.RegionInfo.EstateSettings.Save();
1252 1239
1253 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); 1240 World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed;
1254 } 1241 World.RegionInfo.EstateSettings.SunPosition = sunHour;
1242 World.RegionInfo.EstateSettings.FixedSun = sunFixed;
1243 World.RegionInfo.EstateSettings.Save();
1244
1245 World.EventManager.TriggerEstateToolsSunUpdate(
1246 World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour);
1255 } 1247 }
1256 1248
1257 /// <summary> 1249 /// <summary>
@@ -1627,7 +1619,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1627 1619
1628 public Object osParseJSONNew(string JSON) 1620 public Object osParseJSONNew(string JSON)
1629 { 1621 {
1630 CheckThreatLevel(ThreatLevel.None, "osParseJSON"); 1622 CheckThreatLevel(ThreatLevel.None, "osParseJSONNew");
1631 1623
1632 m_host.AddScriptLPS(1); 1624 m_host.AddScriptLPS(1);
1633 1625
@@ -1681,9 +1673,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1681 CheckThreatLevel(ThreatLevel.Low, "osMessageObject"); 1673 CheckThreatLevel(ThreatLevel.Low, "osMessageObject");
1682 m_host.AddScriptLPS(1); 1674 m_host.AddScriptLPS(1);
1683 1675
1676 UUID objUUID;
1677 if (!UUID.TryParse(objectUUID, out objUUID)) // prior to patching, a thrown exception regarding invalid GUID format would be shouted instead.
1678 {
1679 OSSLShoutError("osMessageObject() cannot send messages to objects with invalid UUIDs");
1680 return;
1681 }
1682
1684 object[] resobj = new object[] { new LSL_Types.LSLString(m_host.UUID.ToString()), new LSL_Types.LSLString(message) }; 1683 object[] resobj = new object[] { new LSL_Types.LSLString(m_host.UUID.ToString()), new LSL_Types.LSLString(message) };
1685 1684
1686 SceneObjectPart sceneOP = World.GetSceneObjectPart(new UUID(objectUUID)); 1685 SceneObjectPart sceneOP = World.GetSceneObjectPart(objUUID);
1686
1687 if (sceneOP == null) // prior to patching, PostObjectEvent() would cause a throw exception to be shouted instead.
1688 {
1689 OSSLShoutError("osMessageObject() cannot send message to " + objUUID.ToString() + ", object was not found in scene.");
1690 return;
1691 }
1687 1692
1688 m_ScriptEngine.PostObjectEvent( 1693 m_ScriptEngine.PostObjectEvent(
1689 sceneOP.LocalId, new EventParams( 1694 sceneOP.LocalId, new EventParams(
@@ -1826,8 +1831,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1826 if (a == null) 1831 if (a == null)
1827 return UUID.Zero; 1832 return UUID.Zero;
1828 1833
1829 System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 1834 string data = Encoding.UTF8.GetString(a.Data);
1830 string data = enc.GetString(a.Data);
1831 NotecardCache.Cache(assetID, data); 1835 NotecardCache.Cache(assetID, data);
1832 }; 1836 };
1833 1837
@@ -1980,7 +1984,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1980 { 1984 {
1981 string retval = String.Empty; 1985 string retval = String.Empty;
1982 IConfigSource config = m_ScriptEngine.ConfigSource; 1986 IConfigSource config = m_ScriptEngine.ConfigSource;
1983 string url = config.Configs["GridInfo"].GetString("GridInfoURI", String.Empty); 1987 string url = null;
1988
1989 IConfig gridInfoConfig = config.Configs["GridInfo"];
1990
1991 if (gridInfoConfig != null)
1992 url = gridInfoConfig.GetString("GridInfoURI", String.Empty);
1984 1993
1985 if (String.IsNullOrEmpty(url)) 1994 if (String.IsNullOrEmpty(url))
1986 return "Configuration Error!"; 1995 return "Configuration Error!";
@@ -2042,8 +2051,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2042 string nick = String.Empty; 2051 string nick = String.Empty;
2043 IConfigSource config = m_ScriptEngine.ConfigSource; 2052 IConfigSource config = m_ScriptEngine.ConfigSource;
2044 2053
2045 if (config.Configs["GridInfo"] != null) 2054 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2046 nick = config.Configs["GridInfo"].GetString("gridnick", nick); 2055 nick = config.Configs[GridInfoServiceConfigSectionName].GetString("gridnick", nick);
2047 2056
2048 if (String.IsNullOrEmpty(nick)) 2057 if (String.IsNullOrEmpty(nick))
2049 nick = GridUserInfo(InfoType.Nick); 2058 nick = GridUserInfo(InfoType.Nick);
@@ -2059,8 +2068,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2059 string name = String.Empty; 2068 string name = String.Empty;
2060 IConfigSource config = m_ScriptEngine.ConfigSource; 2069 IConfigSource config = m_ScriptEngine.ConfigSource;
2061 2070
2062 if (config.Configs["GridInfo"] != null) 2071 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2063 name = config.Configs["GridInfo"].GetString("gridname", name); 2072 name = config.Configs[GridInfoServiceConfigSectionName].GetString("gridname", name);
2064 2073
2065 if (String.IsNullOrEmpty(name)) 2074 if (String.IsNullOrEmpty(name))
2066 name = GridUserInfo(InfoType.Name); 2075 name = GridUserInfo(InfoType.Name);
@@ -2076,8 +2085,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2076 string loginURI = String.Empty; 2085 string loginURI = String.Empty;
2077 IConfigSource config = m_ScriptEngine.ConfigSource; 2086 IConfigSource config = m_ScriptEngine.ConfigSource;
2078 2087
2079 if (config.Configs["GridInfo"] != null) 2088 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2080 loginURI = config.Configs["GridInfo"].GetString("login", loginURI); 2089 loginURI = config.Configs[GridInfoServiceConfigSectionName].GetString("login", loginURI);
2081 2090
2082 if (String.IsNullOrEmpty(loginURI)) 2091 if (String.IsNullOrEmpty(loginURI))
2083 loginURI = GridUserInfo(InfoType.Login); 2092 loginURI = GridUserInfo(InfoType.Login);
@@ -2124,8 +2133,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2124 string retval = String.Empty; 2133 string retval = String.Empty;
2125 IConfigSource config = m_ScriptEngine.ConfigSource; 2134 IConfigSource config = m_ScriptEngine.ConfigSource;
2126 2135
2127 if (config.Configs["GridInfo"] != null) 2136 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2128 retval = config.Configs["GridInfo"].GetString(key, retval); 2137 retval = config.Configs[GridInfoServiceConfigSectionName].GetString(key, retval);
2129 2138
2130 if (String.IsNullOrEmpty(retval)) 2139 if (String.IsNullOrEmpty(retval))
2131 retval = GridUserInfo(InfoType.Custom, key); 2140 retval = GridUserInfo(InfoType.Custom, key);
@@ -2135,7 +2144,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2135 2144
2136 public LSL_String osFormatString(string str, LSL_List strings) 2145 public LSL_String osFormatString(string str, LSL_List strings)
2137 { 2146 {
2138 CheckThreatLevel(ThreatLevel.Low, "osFormatString"); 2147 CheckThreatLevel(ThreatLevel.VeryLow, "osFormatString");
2139 m_host.AddScriptLPS(1); 2148 m_host.AddScriptLPS(1);
2140 2149
2141 return String.Format(str, strings.Data); 2150 return String.Format(str, strings.Data);
@@ -2143,7 +2152,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2143 2152
2144 public LSL_List osMatchString(string src, string pattern, int start) 2153 public LSL_List osMatchString(string src, string pattern, int start)
2145 { 2154 {
2146 CheckThreatLevel(ThreatLevel.High, "osMatchString"); 2155 CheckThreatLevel(ThreatLevel.VeryLow, "osMatchString");
2147 m_host.AddScriptLPS(1); 2156 m_host.AddScriptLPS(1);
2148 2157
2149 LSL_List result = new LSL_List(); 2158 LSL_List result = new LSL_List();
@@ -2185,7 +2194,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2185 2194
2186 public LSL_String osReplaceString(string src, string pattern, string replace, int count, int start) 2195 public LSL_String osReplaceString(string src, string pattern, string replace, int count, int start)
2187 { 2196 {
2188 CheckThreatLevel(ThreatLevel.High, "osReplaceString"); 2197 CheckThreatLevel(ThreatLevel.VeryLow, "osReplaceString");
2189 m_host.AddScriptLPS(1); 2198 m_host.AddScriptLPS(1);
2190 2199
2191 // Normalize indices (if negative). 2200 // Normalize indices (if negative).
@@ -2480,7 +2489,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2480 return; 2489 return;
2481 2490
2482 Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); 2491 Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z);
2483 module.MoveToTarget(npcId, World, pos, false, true); 2492 module.MoveToTarget(npcId, World, pos, false, true, false);
2484 } 2493 }
2485 } 2494 }
2486 2495
@@ -2505,7 +2514,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2505 World, 2514 World,
2506 pos, 2515 pos,
2507 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, 2516 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0,
2508 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0); 2517 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0,
2518 (options & ScriptBaseClass.OS_NPC_RUNNING) != 0);
2509 } 2519 }
2510 } 2520 }
2511 2521
@@ -2555,7 +2565,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2555 2565
2556 public void osNpcStopMoveToTarget(LSL_Key npc) 2566 public void osNpcStopMoveToTarget(LSL_Key npc)
2557 { 2567 {
2558 CheckThreatLevel(ThreatLevel.VeryLow, "osNpcStopMoveTo"); 2568 CheckThreatLevel(ThreatLevel.High, "osNpcStopMoveToTarget");
2559 m_host.AddScriptLPS(1); 2569 m_host.AddScriptLPS(1);
2560 2570
2561 INPCModule module = World.RequestModuleInterface<INPCModule>(); 2571 INPCModule module = World.RequestModuleInterface<INPCModule>();
@@ -2572,6 +2582,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2572 2582
2573 public void osNpcSay(LSL_Key npc, string message) 2583 public void osNpcSay(LSL_Key npc, string message)
2574 { 2584 {
2585 osNpcSay(npc, 0, message);
2586 }
2587
2588 public void osNpcSay(LSL_Key npc, int channel, string message)
2589 {
2575 CheckThreatLevel(ThreatLevel.High, "osNpcSay"); 2590 CheckThreatLevel(ThreatLevel.High, "osNpcSay");
2576 m_host.AddScriptLPS(1); 2591 m_host.AddScriptLPS(1);
2577 2592
@@ -2583,7 +2598,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2583 if (!module.CheckPermissions(npcId, m_host.OwnerID)) 2598 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2584 return; 2599 return;
2585 2600
2586 module.Say(npcId, World, message); 2601 module.Say(npcId, World, message, channel);
2602 }
2603 }
2604
2605 public void osNpcShout(LSL_Key npc, int channel, string message)
2606 {
2607 CheckThreatLevel(ThreatLevel.High, "osNpcShout");
2608 m_host.AddScriptLPS(1);
2609
2610 INPCModule module = World.RequestModuleInterface<INPCModule>();
2611 if (module != null)
2612 {
2613 UUID npcId = new UUID(npc.m_string);
2614
2615 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2616 return;
2617
2618 module.Shout(npcId, World, message, channel);
2587 } 2619 }
2588 } 2620 }
2589 2621
@@ -2684,6 +2716,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2684 } 2716 }
2685 } 2717 }
2686 2718
2719 public void osNpcWhisper(LSL_Key npc, int channel, string message)
2720 {
2721 CheckThreatLevel(ThreatLevel.High, "osNpcWhisper");
2722 m_host.AddScriptLPS(1);
2723
2724 INPCModule module = World.RequestModuleInterface<INPCModule>();
2725 if (module != null)
2726 {
2727 UUID npcId = new UUID(npc.m_string);
2728
2729 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2730 return;
2731
2732 module.Whisper(npcId, World, message, channel);
2733 }
2734 }
2735
2736 public void osNpcTouch(LSL_Key npcLSL_Key, LSL_Key object_key, LSL_Integer link_num)
2737 {
2738 CheckThreatLevel(ThreatLevel.High, "osNpcTouch");
2739 m_host.AddScriptLPS(1);
2740 INPCModule module = World.RequestModuleInterface<INPCModule>();
2741 int linkNum = link_num.value;
2742 if (module != null || (linkNum < 0 && linkNum != ScriptBaseClass.LINK_THIS))
2743 {
2744 UUID npcId;
2745 if (!UUID.TryParse(npcLSL_Key, out npcId) || !module.CheckPermissions(npcId, m_host.OwnerID))
2746 return;
2747 SceneObjectPart part = null;
2748 UUID objectId;
2749 if (UUID.TryParse(LSL_String.ToString(object_key), out objectId))
2750 part = World.GetSceneObjectPart(objectId);
2751 if (part == null)
2752 return;
2753 if (linkNum != ScriptBaseClass.LINK_THIS)
2754 {
2755 if (linkNum == 0 || linkNum == ScriptBaseClass.LINK_ROOT)
2756 { // 0 and 1 are treated as root, find the root if the current part isnt it
2757 if (!part.IsRoot)
2758 part = part.ParentGroup.RootPart;
2759 }
2760 else
2761 { // Find the prim with the given link number if not found then fail silently
2762 part = part.ParentGroup.GetLinkNumPart(linkNum);
2763 if (part == null)
2764 return;
2765 }
2766 }
2767 module.Touch(npcId, part.UUID);
2768 }
2769 }
2770
2687 /// <summary> 2771 /// <summary>
2688 /// Save the current appearance of the script owner permanently to the named notecard. 2772 /// Save the current appearance of the script owner permanently to the named notecard.
2689 /// </summary> 2773 /// </summary>
@@ -2835,21 +2919,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2835 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); 2919 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar");
2836 m_host.AddScriptLPS(1); 2920 m_host.AddScriptLPS(1);
2837 2921
2838 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) 2922 World.ForEachRootScenePresence(delegate(ScenePresence sp)
2839 { 2923 {
2840 World.ForEachRootScenePresence(delegate(ScenePresence sp) 2924 if (sp.Firstname == FirstName && sp.Lastname == SurName)
2841 { 2925 {
2842 if (sp.Firstname == FirstName && sp.Lastname == SurName) 2926 // kick client...
2843 { 2927 if (alert != null)
2844 // kick client... 2928 sp.ControllingClient.Kick(alert);
2845 if (alert != null)
2846 sp.ControllingClient.Kick(alert);
2847 2929
2848 // ...and close on our side 2930 // ...and close on our side
2849 sp.Scene.IncomingCloseAgent(sp.UUID); 2931 sp.Scene.IncomingCloseAgent(sp.UUID);
2850 } 2932 }
2851 }); 2933 });
2852 }
2853 } 2934 }
2854 2935
2855 public void osCauseDamage(string avatar, double damage) 2936 public void osCauseDamage(string avatar, double damage)
@@ -3095,5 +3176,151 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3095 3176
3096 return ScriptBaseClass.TRUE; 3177 return ScriptBaseClass.TRUE;
3097 } 3178 }
3179
3180 /// <summary>
3181 /// Sets terrain estate texture
3182 /// </summary>
3183 /// <param name="level"></param>
3184 /// <param name="texture"></param>
3185 /// <returns></returns>
3186 public void osSetTerrainTexture(int level, LSL_Key texture)
3187 {
3188 CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture");
3189
3190 m_host.AddScriptLPS(1);
3191 //Check to make sure that the script's owner is the estate manager/master
3192 //World.Permissions.GenericEstatePermission(
3193 if (World.Permissions.IsGod(m_host.OwnerID))
3194 {
3195 if (level < 0 || level > 3)
3196 return;
3197
3198 UUID textureID = new UUID();
3199 if (!UUID.TryParse(texture, out textureID))
3200 return;
3201
3202 // estate module is required
3203 IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
3204 if (estate != null)
3205 estate.setEstateTerrainBaseTexture(level, textureID);
3206 }
3207 }
3208
3209 /// <summary>
3210 /// Sets terrain heights of estate
3211 /// </summary>
3212 /// <param name="corner"></param>
3213 /// <param name="low"></param>
3214 /// <param name="high"></param>
3215 /// <returns></returns>
3216 public void osSetTerrainTextureHeight(int corner, double low, double high)
3217 {
3218 CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight");
3219
3220 m_host.AddScriptLPS(1);
3221 //Check to make sure that the script's owner is the estate manager/master
3222 //World.Permissions.GenericEstatePermission(
3223 if (World.Permissions.IsGod(m_host.OwnerID))
3224 {
3225 if (corner < 0 || corner > 3)
3226 return;
3227
3228 // estate module is required
3229 IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
3230 if (estate != null)
3231 estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high);
3232 }
3233 }
3234
3235 public void osForceAttachToAvatar(int attachmentPoint)
3236 {
3237 CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar");
3238
3239 m_host.AddScriptLPS(1);
3240
3241 InitLSL();
3242 ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint);
3243 }
3244
3245 public void osForceAttachToAvatarFromInventory(string itemName, int attachmentPoint)
3246 {
3247 CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatarFromInventory");
3248
3249 m_host.AddScriptLPS(1);
3250
3251 ForceAttachToAvatarFromInventory(m_host.OwnerID, itemName, attachmentPoint);
3252 }
3253
3254 public void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint)
3255 {
3256 CheckThreatLevel(ThreatLevel.Severe, "osForceAttachToOtherAvatarFromInventory");
3257
3258 m_host.AddScriptLPS(1);
3259
3260 UUID avatarId;
3261
3262 if (!UUID.TryParse(rawAvatarId, out avatarId))
3263 return;
3264
3265 ForceAttachToAvatarFromInventory(avatarId, itemName, attachmentPoint);
3266 }
3267
3268 public void ForceAttachToAvatarFromInventory(UUID avatarId, string itemName, int attachmentPoint)
3269 {
3270 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3271
3272 if (attachmentsModule == null)
3273 return;
3274
3275 InitLSL();
3276
3277 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
3278
3279 if (item == null)
3280 {
3281 ((LSL_Api)m_LSL_Api).llSay(0, string.Format("Could not find object '{0}'", itemName));
3282 throw new Exception(String.Format("The inventory item '{0}' could not be found", itemName));
3283 }
3284
3285 if (item.InvType != (int)InventoryType.Object)
3286 {
3287 // FIXME: Temporary null check for regression tests since they dont' have the infrastructure to set
3288 // up the api reference.
3289 if (m_LSL_Api != null)
3290 ((LSL_Api)m_LSL_Api).llSay(0, string.Format("Unable to attach, item '{0}' is not an object.", itemName));
3291
3292 throw new Exception(String.Format("The inventory item '{0}' is not an object", itemName));
3293
3294 return;
3295 }
3296
3297 ScenePresence sp = World.GetScenePresence(avatarId);
3298
3299 if (sp == null)
3300 return;
3301
3302 InventoryItemBase newItem = World.MoveTaskInventoryItem(sp.UUID, UUID.Zero, m_host, item.ItemID);
3303
3304 if (newItem == null)
3305 {
3306 m_log.ErrorFormat(
3307 "[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}",
3308 itemName, m_host.Name, attachmentPoint, World.Name);
3309
3310 return;
3311 }
3312
3313 attachmentsModule.RezSingleAttachmentFromInventory(sp, newItem.ID, (uint)attachmentPoint);
3314 }
3315
3316 public void osForceDetachFromAvatar()
3317 {
3318 CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar");
3319
3320 m_host.AddScriptLPS(1);
3321
3322 InitLSL();
3323 ((LSL_Api)m_LSL_Api).DetachFromAvatar();
3324 }
3098 } 3325 }
3099} 3326}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs
index 93e0261..efa86fc 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Listener.cs
@@ -88,13 +88,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
88 88
89 public Object[] GetSerializationData(UUID itemID) 89 public Object[] GetSerializationData(UUID itemID)
90 { 90 {
91 return m_commsPlugin.GetSerializationData(itemID); 91 if (m_commsPlugin != null)
92 return m_commsPlugin.GetSerializationData(itemID);
93 else
94 return new Object[]{};
92 } 95 }
93 96
94 public void CreateFromData(uint localID, UUID itemID, UUID hostID, 97 public void CreateFromData(uint localID, UUID itemID, UUID hostID,
95 Object[] data) 98 Object[] data)
96 { 99 {
97 m_commsPlugin.CreateFromData(localID, itemID, hostID, data); 100 if (m_commsPlugin != null)
101 m_commsPlugin.CreateFromData(localID, itemID, hostID, data);
98 } 102 }
99 } 103 }
100} \ No newline at end of file 104} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index 1373971..19f3ce1 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -308,7 +308,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
308 } 308 }
309 SceneObjectPart SensePoint = ts.host; 309 SceneObjectPart SensePoint = ts.host;
310 310
311 Vector3 fromRegionPos = SensePoint.AbsolutePosition; 311 Vector3 fromRegionPos = SensePoint.GetWorldPosition();
312 312
313 // pre define some things to avoid repeated definitions in the loop body 313 // pre define some things to avoid repeated definitions in the loop body
314 Vector3 toRegionPos; 314 Vector3 toRegionPos;
@@ -323,13 +323,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
323 Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation! 323 Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation!
324 if (SensePoint.ParentGroup.IsAttachment) 324 if (SensePoint.ParentGroup.IsAttachment)
325 { 325 {
326 // In attachments, the sensor cone always orients with the 326 // In attachments, rotate the sensor cone with the
327 // avatar rotation. This may include a nonzero elevation if 327 // avatar rotation. This may include a nonzero elevation if
328 // in mouselook. 328 // in mouselook.
329 // This will not include the rotation and position of the
330 // attachment point (e.g. your head when a sensor is in your
331 // hair attached to your scull. Your hair will turn with
332 // your head but the sensor will stay with your (global)
333 // avatar rotation and position.
334 // Position of a sensor in a child prim attached to an avatar
335 // will be still wrong.
329 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 336 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
330 fromRegionPos = avatar.AbsolutePosition; 337 fromRegionPos = avatar.AbsolutePosition;
331 q = avatar.Rotation; 338 q = avatar.Rotation;
332 } 339 }
340
333 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); 341 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W);
334 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); 342 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r);
335 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); 343 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir);
@@ -441,14 +449,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
441 return sensedEntities; 449 return sensedEntities;
442 450
443 SceneObjectPart SensePoint = ts.host; 451 SceneObjectPart SensePoint = ts.host;
444 Vector3 fromRegionPos = SensePoint.AbsolutePosition; 452 Vector3 fromRegionPos = SensePoint.GetWorldPosition();
445 453
446 Quaternion q = SensePoint.RotationOffset; 454 Quaternion q = SensePoint.GetWorldRotation();
447 if (SensePoint.ParentGroup.IsAttachment) 455 if (SensePoint.ParentGroup.IsAttachment)
448 { 456 {
449 // In attachments, the sensor cone always orients with the 457 // In attachments, rotate the sensor cone with the
450 // avatar rotation. This may include a nonzero elevation if 458 // avatar rotation. This may include a nonzero elevation if
451 // in mouselook. 459 // in mouselook.
460 // This will not include the rotation and position of the
461 // attachment point (e.g. your head when a sensor is in your
462 // hair attached to your scull. Your hair will turn with
463 // your head but the sensor will stay with your (global)
464 // avatar rotation and position.
465 // Position of a sensor in a child prim attached to an avatar
466 // will be still wrong.
452 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 467 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
453 if (avatar == null) 468 if (avatar == null)
454 return sensedEntities; 469 return sensedEntities;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
index 40ae495..af35258 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs
@@ -105,6 +105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
105 LSL_Integer llFloor(double f); 105 LSL_Integer llFloor(double f);
106 void llForceMouselook(int mouselook); 106 void llForceMouselook(int mouselook);
107 LSL_Float llFrand(double mag); 107 LSL_Float llFrand(double mag);
108 LSL_Key llGenerateKey();
108 LSL_Vector llGetAccel(); 109 LSL_Vector llGetAccel();
109 LSL_Integer llGetAgentInfo(string id); 110 LSL_Integer llGetAgentInfo(string id);
110 LSL_String llGetAgentLanguage(string id); 111 LSL_String llGetAgentLanguage(string id);
@@ -150,7 +151,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
150 LSL_Rotation llGetLocalRot(); 151 LSL_Rotation llGetLocalRot();
151 LSL_Float llGetMass(); 152 LSL_Float llGetMass();
152 LSL_Float llGetMassMKS(); 153 LSL_Float llGetMassMKS();
153 void llGetNextEmail(string address, string subject); 154 LSL_Integer llGetMemoryLimit();
155 void llGetNextEmail(string address, string subject);
154 LSL_String llGetNotecardLine(string name, int line); 156 LSL_String llGetNotecardLine(string name, int line);
155 LSL_Key llGetNumberOfNotecardLines(string name); 157 LSL_Key llGetNumberOfNotecardLines(string name);
156 LSL_Integer llGetNumberOfPrims(); 158 LSL_Integer llGetNumberOfPrims();
@@ -188,6 +190,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
188 LSL_String llGetScriptName(); 190 LSL_String llGetScriptName();
189 LSL_Integer llGetScriptState(string name); 191 LSL_Integer llGetScriptState(string name);
190 LSL_String llGetSimulatorHostname(); 192 LSL_String llGetSimulatorHostname();
193 LSL_Integer llGetSPMaxMemory();
191 LSL_Integer llGetStartParameter(); 194 LSL_Integer llGetStartParameter();
192 LSL_Integer llGetStatus(int status); 195 LSL_Integer llGetStatus(int status);
193 LSL_String llGetSubString(string src, int start, int end); 196 LSL_String llGetSubString(string src, int start, int end);
@@ -323,6 +326,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
323 void llSay(int channelID, string text); 326 void llSay(int channelID, string text);
324 void llScaleTexture(double u, double v, int face); 327 void llScaleTexture(double u, double v, int face);
325 LSL_Integer llScriptDanger(LSL_Vector pos); 328 LSL_Integer llScriptDanger(LSL_Vector pos);
329 void llScriptProfiler(LSL_Integer flag);
326 LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata); 330 LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata);
327 void llSensor(string name, string id, int type, double range, double arc); 331 void llSensor(string name, string id, int type, double range, double arc);
328 void llSensorRemove(); 332 void llSensorRemove();
@@ -347,6 +351,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
347 void llSetLinkTexture(int linknumber, string texture, int face); 351 void llSetLinkTexture(int linknumber, string texture, int face);
348 void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate); 352 void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate);
349 void llSetLocalRot(LSL_Rotation rot); 353 void llSetLocalRot(LSL_Rotation rot);
354 LSL_Integer llSetMemoryLimit(LSL_Integer limit);
350 void llSetObjectDesc(string desc); 355 void llSetObjectDesc(string desc);
351 void llSetObjectName(string name); 356 void llSetObjectName(string name);
352 void llSetObjectPermMask(int mask, int value); 357 void llSetObjectPermMask(int mask, int value);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 444a681..1facc96 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -98,6 +98,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
98 void osAvatarPlayAnimation(string avatar, string animation); 98 void osAvatarPlayAnimation(string avatar, string animation);
99 void osAvatarStopAnimation(string avatar, string animation); 99 void osAvatarStopAnimation(string avatar, string animation);
100 100
101 // Attachment commands
102
103 /// <summary>
104 /// Attach the object containing this script to the avatar that owns it without asking for PERMISSION_ATTACH
105 /// </summary>
106 /// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
107 void osForceAttachToAvatar(int attachment);
108
109 /// <summary>
110 /// Attach an inventory item in the object containing this script to the avatar that owns it without asking for PERMISSION_ATTACH
111 /// </summary>
112 /// <remarks>
113 /// Nothing happens if the owner is not in the region.
114 /// </remarks>
115 /// <param name='itemName'>Tha name of the item. If this is not found then a warning is said to the owner</param>
116 /// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
117 void osForceAttachToAvatarFromInventory(string itemName, int attachment);
118
119 /// <summary>
120 /// Attach an inventory item in the object containing this script to any avatar in the region without asking for PERMISSION_ATTACH
121 /// </summary>
122 /// <remarks>
123 /// Nothing happens if the avatar is not in the region.
124 /// </remarks>
125 /// <param name='rawAvatarId'>The UUID of the avatar to which to attach. Nothing happens if this is not a UUID</para>
126 /// <param name='itemName'>The name of the item. If this is not found then a warning is said to the owner</param>
127 /// <param name='attachment'>The attachment point. For example, ATTACH_CHEST</param>
128 void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint);
129
130 /// <summary>
131 /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH
132 /// </summary>
133 /// <remarks>Nothing happens if the object is not attached.</remarks>
134 void osForceDetachFromAvatar();
135
101 //texture draw functions 136 //texture draw functions
102 string osMovePen(string drawList, int x, int y); 137 string osMovePen(string drawList, int x, int y);
103 string osDrawLine(string drawList, int startX, int startY, int endX, int endY); 138 string osDrawLine(string drawList, int startX, int startY, int endX, int endY);
@@ -203,11 +238,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
203 void osNpcSetRot(LSL_Key npc, rotation rot); 238 void osNpcSetRot(LSL_Key npc, rotation rot);
204 void osNpcStopMoveToTarget(LSL_Key npc); 239 void osNpcStopMoveToTarget(LSL_Key npc);
205 void osNpcSay(key npc, string message); 240 void osNpcSay(key npc, string message);
241 void osNpcSay(key npc, int channel, string message);
242 void osNpcShout(key npc, int channel, string message);
206 void osNpcSit(key npc, key target, int options); 243 void osNpcSit(key npc, key target, int options);
207 void osNpcStand(LSL_Key npc); 244 void osNpcStand(LSL_Key npc);
208 void osNpcRemove(key npc); 245 void osNpcRemove(key npc);
209 void osNpcPlayAnimation(LSL_Key npc, string animation); 246 void osNpcPlayAnimation(LSL_Key npc, string animation);
210 void osNpcStopAnimation(LSL_Key npc, string animation); 247 void osNpcStopAnimation(LSL_Key npc, string animation);
248 void osNpcTouch(LSL_Key npcLSL_Key, LSL_Key object_key, LSL_Integer link_num);
249 void osNpcWhisper(key npc, int channel, string message);
211 250
212 LSL_Key osOwnerSaveAppearance(string notecard); 251 LSL_Key osOwnerSaveAppearance(string notecard);
213 LSL_Key osAgentSaveAppearance(key agentId, string notecard); 252 LSL_Key osAgentSaveAppearance(key agentId, string notecard);
@@ -234,5 +273,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
234 273
235 LSL_Integer osInviteToGroup(LSL_Key agentId); 274 LSL_Integer osInviteToGroup(LSL_Key agentId);
236 LSL_Integer osEjectFromGroup(LSL_Key agentId); 275 LSL_Integer osEjectFromGroup(LSL_Key agentId);
276
277 void osSetTerrainTexture(int level, LSL_Key texture);
278 void osSetTerrainTextureHeight(int corner, double low, double high);
237 } 279 }
238} 280}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index ad4f70c..a08cc42 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -383,6 +383,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
383 public const int PRIM_SCULPT_FLAG_INVERT = 64; 383 public const int PRIM_SCULPT_FLAG_INVERT = 64;
384 public const int PRIM_SCULPT_FLAG_MIRROR = 128; 384 public const int PRIM_SCULPT_FLAG_MIRROR = 128;
385 385
386 public const int PROFILE_NONE = 0;
387 public const int PROFILE_SCRIPT_MEMORY = 1;
388
386 public const int MASK_BASE = 0; 389 public const int MASK_BASE = 0;
387 public const int MASK_OWNER = 1; 390 public const int MASK_OWNER = 1;
388 public const int MASK_GROUP = 2; 391 public const int MASK_GROUP = 2;
@@ -641,6 +644,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
641 public const int OS_NPC_FLY = 0; 644 public const int OS_NPC_FLY = 0;
642 public const int OS_NPC_NO_FLY = 1; 645 public const int OS_NPC_NO_FLY = 1;
643 public const int OS_NPC_LAND_AT_TARGET = 2; 646 public const int OS_NPC_LAND_AT_TARGET = 2;
647 public const int OS_NPC_RUNNING = 4;
644 648
645 public const int OS_NPC_SIT_NOW = 0; 649 public const int OS_NPC_SIT_NOW = 0;
646 650
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
index 2f8e169..89b6eff 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
@@ -165,11 +165,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
165 m_LSL_Functions.llBreakLink(linknum); 165 m_LSL_Functions.llBreakLink(linknum);
166 } 166 }
167 167
168 public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options)
169 {
170 return m_LSL_Functions.llCastRay(start, end, options);
171 }
172
173 public LSL_Integer llCeil(double f) 168 public LSL_Integer llCeil(double f)
174 { 169 {
175 return m_LSL_Functions.llCeil(f); 170 return m_LSL_Functions.llCeil(f);
@@ -376,6 +371,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
376 return m_LSL_Functions.llFrand(mag); 371 return m_LSL_Functions.llFrand(mag);
377 } 372 }
378 373
374 public LSL_Key llGenerateKey()
375 {
376 return m_LSL_Functions.llGenerateKey();
377 }
378
379 public LSL_Vector llGetAccel() 379 public LSL_Vector llGetAccel()
380 { 380 {
381 return m_LSL_Functions.llGetAccel(); 381 return m_LSL_Functions.llGetAccel();
@@ -591,6 +591,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
591 return m_LSL_Functions.llGetMassMKS(); 591 return m_LSL_Functions.llGetMassMKS();
592 } 592 }
593 593
594 public LSL_Integer llGetMemoryLimit()
595 {
596 return m_LSL_Functions.llGetMemoryLimit();
597 }
598
594 public void llGetNextEmail(string address, string subject) 599 public void llGetNextEmail(string address, string subject)
595 { 600 {
596 m_LSL_Functions.llGetNextEmail(address, subject); 601 m_LSL_Functions.llGetNextEmail(address, subject);
@@ -781,6 +786,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
781 return m_LSL_Functions.llGetSimulatorHostname(); 786 return m_LSL_Functions.llGetSimulatorHostname();
782 } 787 }
783 788
789 public LSL_Integer llGetSPMaxMemory()
790 {
791 return m_LSL_Functions.llGetSPMaxMemory();
792 }
793
784 public LSL_Integer llGetStartParameter() 794 public LSL_Integer llGetStartParameter()
785 { 795 {
786 return m_LSL_Functions.llGetStartParameter(); 796 return m_LSL_Functions.llGetStartParameter();
@@ -956,6 +966,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
956 return m_LSL_Functions.llRequestDisplayName(id); 966 return m_LSL_Functions.llRequestDisplayName(id);
957 } 967 }
958 968
969 public LSL_List llCastRay(LSL_Vector start, LSL_Vector end, LSL_List options)
970 {
971 return m_LSL_Functions.llCastRay(start, end, options);
972 }
973
959 public void llLinkParticleSystem(int linknum, LSL_List rules) 974 public void llLinkParticleSystem(int linknum, LSL_List rules)
960 { 975 {
961 m_LSL_Functions.llLinkParticleSystem(linknum, rules); 976 m_LSL_Functions.llLinkParticleSystem(linknum, rules);
@@ -1450,6 +1465,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1450 return m_LSL_Functions.llScriptDanger(pos); 1465 return m_LSL_Functions.llScriptDanger(pos);
1451 } 1466 }
1452 1467
1468 public void llScriptProfiler(LSL_Integer flags)
1469 {
1470 m_LSL_Functions.llScriptProfiler(flags);
1471 }
1472
1453 public LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata) 1473 public LSL_Key llSendRemoteData(string channel, string dest, int idata, string sdata)
1454 { 1474 {
1455 return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); 1475 return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata);
@@ -1565,6 +1585,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1565 m_LSL_Functions.llSetLocalRot(rot); 1585 m_LSL_Functions.llSetLocalRot(rot);
1566 } 1586 }
1567 1587
1588 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
1589 {
1590 return m_LSL_Functions.llSetMemoryLimit(limit);
1591 }
1592
1568 public void llSetObjectDesc(string desc) 1593 public void llSetObjectDesc(string desc)
1569 { 1594 {
1570 m_LSL_Functions.llSetObjectDesc(desc); 1595 m_LSL_Functions.llSetObjectDesc(desc);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 680cefb4..b40bdf0 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -289,8 +289,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
289 m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); 289 m_OSSL_Functions.osAvatarStopAnimation(avatar, animation);
290 } 290 }
291 291
292 // Avatar functions
292 293
293 //Texture Draw functions 294 public void osForceAttachToAvatar(int attachmentPoint)
295 {
296 m_OSSL_Functions.osForceAttachToAvatar(attachmentPoint);
297 }
298
299 public void osForceAttachToAvatarFromInventory(string itemName, int attachmentPoint)
300 {
301 m_OSSL_Functions.osForceAttachToAvatarFromInventory(itemName, attachmentPoint);
302 }
303
304 public void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint)
305 {
306 m_OSSL_Functions.osForceAttachToOtherAvatarFromInventory(rawAvatarId, itemName, attachmentPoint);
307 }
308
309 public void osForceDetachFromAvatar()
310 {
311 m_OSSL_Functions.osForceDetachFromAvatar();
312 }
313
314 // Texture Draw functions
294 315
295 public string osMovePen(string drawList, int x, int y) 316 public string osMovePen(string drawList, int x, int y)
296 { 317 {
@@ -569,6 +590,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
569 m_OSSL_Functions.osNpcSay(npc, message); 590 m_OSSL_Functions.osNpcSay(npc, message);
570 } 591 }
571 592
593 public void osNpcSay(key npc, int channel, string message)
594 {
595 m_OSSL_Functions.osNpcSay(npc, channel, message);
596 }
597
598
599 public void osNpcShout(key npc, int channel, string message)
600 {
601 m_OSSL_Functions.osNpcShout(npc, channel, message);
602 }
603
572 public void osNpcSit(LSL_Key npc, LSL_Key target, int options) 604 public void osNpcSit(LSL_Key npc, LSL_Key target, int options)
573 { 605 {
574 m_OSSL_Functions.osNpcSit(npc, target, options); 606 m_OSSL_Functions.osNpcSit(npc, target, options);
@@ -594,6 +626,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
594 m_OSSL_Functions.osNpcStopAnimation(npc, animation); 626 m_OSSL_Functions.osNpcStopAnimation(npc, animation);
595 } 627 }
596 628
629 public void osNpcWhisper(key npc, int channel, string message)
630 {
631 m_OSSL_Functions.osNpcWhisper(npc, channel, message);
632 }
633
634 public void osNpcTouch(LSL_Key npcLSL_Key, LSL_Key object_key, LSL_Integer link_num)
635 {
636 m_OSSL_Functions.osNpcTouch(npcLSL_Key, object_key, link_num);
637 }
638
597 public LSL_Key osOwnerSaveAppearance(string notecard) 639 public LSL_Key osOwnerSaveAppearance(string notecard)
598 { 640 {
599 return m_OSSL_Functions.osOwnerSaveAppearance(notecard); 641 return m_OSSL_Functions.osOwnerSaveAppearance(notecard);
@@ -878,5 +920,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
878 { 920 {
879 return m_OSSL_Functions.osEjectFromGroup(agentId); 921 return m_OSSL_Functions.osEjectFromGroup(agentId);
880 } 922 }
923
924 public void osSetTerrainTexture(int level, LSL_Key texture)
925 {
926 m_OSSL_Functions.osSetTerrainTexture(level, texture);
927 }
928
929 public void osSetTerrainTextureHeight(int corner, double low, double high)
930 {
931 m_OSSL_Functions.osSetTerrainTextureHeight(corner, low, high);
932 }
881 } 933 }
882} 934}
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
index 8f2ec49..17a0d69 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
@@ -31,6 +31,7 @@ using System.Collections.Generic;
31using System.Globalization; 31using System.Globalization;
32using System.Reflection; 32using System.Reflection;
33using System.IO; 33using System.IO;
34using System.Text;
34using Microsoft.CSharp; 35using Microsoft.CSharp;
35//using Microsoft.JScript; 36//using Microsoft.JScript;
36using Microsoft.VisualBasic; 37using Microsoft.VisualBasic;
@@ -711,9 +712,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
711 // 712 //
712 string filetext = System.Convert.ToBase64String(data); 713 string filetext = System.Convert.ToBase64String(data);
713 714
714 System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 715 Byte[] buf = Encoding.ASCII.GetBytes(filetext);
715
716 Byte[] buf = enc.GetBytes(filetext);
717 716
718 FileStream sfs = File.Create(assembly + ".text"); 717 FileStream sfs = File.Create(assembly + ".text");
719 sfs.Write(buf, 0, buf.Length); 718 sfs.Write(buf, 0, buf.Length);
@@ -804,8 +803,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
804 mapstring += String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value); 803 mapstring += String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value);
805 } 804 }
806 805
807 System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); 806 Byte[] mapbytes = Encoding.ASCII.GetBytes(mapstring);
808 Byte[] mapbytes = enc.GetBytes(mapstring);
809 FileStream mfs = File.Create(filename); 807 FileStream mfs = File.Create(filename);
810 mfs.Write(mapbytes, 0, mapbytes.Length); 808 mfs.Write(mapbytes, 0, mapbytes.Length);
811 mfs.Close(); 809 mfs.Close();
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 5e68d69..8d92ba5 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -26,16 +26,17 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Globalization;
29using System.IO; 32using System.IO;
30using System.Diagnostics; //for [DebuggerNonUserCode] 33using System.Diagnostics; //for [DebuggerNonUserCode]
34using System.Reflection;
31using System.Runtime.Remoting; 35using System.Runtime.Remoting;
32using System.Runtime.Remoting.Lifetime; 36using System.Runtime.Remoting.Lifetime;
33using System.Threading;
34using System.Collections;
35using System.Collections.Generic;
36using System.Security.Policy; 37using System.Security.Policy;
37using System.Reflection; 38using System.Text;
38using System.Globalization; 39using System.Threading;
39using System.Xml; 40using System.Xml;
40using OpenMetaverse; 41using OpenMetaverse;
41using log4net; 42using log4net;
@@ -121,6 +122,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
121 122
122 public bool Running { get; set; } 123 public bool Running { get; set; }
123 124
125 public bool Run { get; set; }
126
124 public bool Suspended 127 public bool Suspended
125 { 128 {
126 get { return m_Suspended; } 129 get { return m_Suspended; }
@@ -216,6 +219,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
216 m_postOnRez = postOnRez; 219 m_postOnRez = postOnRez;
217 m_AttachedAvatar = part.ParentGroup.AttachedAvatar; 220 m_AttachedAvatar = part.ParentGroup.AttachedAvatar;
218 m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; 221 m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID;
222 Run = true;
219 223
220 if (part != null) 224 if (part != null)
221 { 225 {
@@ -232,7 +236,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
232 foreach (string api in am.GetApis()) 236 foreach (string api in am.GetApis())
233 { 237 {
234 m_Apis[api] = am.CreateApi(api); 238 m_Apis[api] = am.CreateApi(api);
235 m_Apis[api].Initialize(engine, part, LocalID, itemID); 239 m_Apis[api].Initialize(engine, part, ScriptTask);
236 } 240 }
237 241
238 try 242 try
@@ -295,13 +299,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
295 using (FileStream fs = File.Open(savedState, 299 using (FileStream fs = File.Open(savedState,
296 FileMode.Open, FileAccess.Read, FileShare.None)) 300 FileMode.Open, FileAccess.Read, FileShare.None))
297 { 301 {
298 System.Text.UTF8Encoding enc =
299 new System.Text.UTF8Encoding();
300
301 Byte[] data = new Byte[size]; 302 Byte[] data = new Byte[size];
302 fs.Read(data, 0, size); 303 fs.Read(data, 0, size);
303 304
304 xml = enc.GetString(data); 305 xml = Encoding.UTF8.GetString(data);
305 306
306 ScriptSerializer.Deserialize(xml, this); 307 ScriptSerializer.Deserialize(xml, this);
307 308
@@ -330,16 +331,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
330 } 331 }
331 else 332 else
332 { 333 {
333 m_log.ErrorFormat( 334 m_log.WarnFormat(
334 "[SCRIPT INSTANCE]: Unable to load script state from assembly {0}: Memory limit exceeded", 335 "[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). Memory limit exceeded",
335 assembly); 336 savedState, ScriptName, ItemID, PrimName, ObjectID, assembly);
336 } 337 }
337 } 338 }
338 catch (Exception e) 339 catch (Exception e)
339 { 340 {
340 m_log.ErrorFormat( 341 m_log.ErrorFormat(
341 "[SCRIPT INSTANCE]: Unable to load script state from assembly {0}. XML is {1}. Exception {2}{3}", 342 "[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). XML is {6}. Exception {7}{8}",
342 assembly, xml, e.Message, e.StackTrace); 343 savedState, ScriptName, ItemID, PrimName, ObjectID, assembly, xml, e.Message, e.StackTrace);
343 } 344 }
344 } 345 }
345// else 346// else
@@ -354,10 +355,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
354 355
355 public void Init() 356 public void Init()
356 { 357 {
357 if (!m_startOnInit) return; 358 if (!m_startOnInit)
359 return;
358 360
359 if (m_startedFromSavedState) 361 if (m_startedFromSavedState)
360 { 362 {
363 if (!Run)
364 return;
365
361 Start(); 366 Start();
362 if (m_postOnRez) 367 if (m_postOnRez)
363 { 368 {
@@ -390,6 +395,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
390 } 395 }
391 else 396 else
392 { 397 {
398 if (!Run)
399 return;
400
393 Start(); 401 Start();
394 PostEvent(new EventParams("state_entry", 402 PostEvent(new EventParams("state_entry",
395 new Object[0], new DetectParams[0])); 403 new Object[0], new DetectParams[0]));
@@ -946,8 +954,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
946 try 954 try
947 { 955 {
948 FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state")); 956 FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state"));
949 System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); 957 Byte[] buf = Util.UTF8NoBomEncoding.GetBytes(xml);
950 Byte[] buf = enc.GetBytes(xml);
951 fs.Write(buf, 0, buf.Length); 958 fs.Write(buf, 0, buf.Length);
952 fs.Close(); 959 fs.Close();
953 } 960 }
@@ -966,7 +973,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
966 public IScriptApi GetApi(string name) 973 public IScriptApi GetApi(string name)
967 { 974 {
968 if (m_Apis.ContainsKey(name)) 975 if (m_Apis.ContainsKey(name))
976 {
977// m_log.DebugFormat("[SCRIPT INSTANCE]: Found api {0} in {1}@{2}", name, ScriptName, PrimName);
978
969 return m_Apis[name]; 979 return m_Apis[name];
980 }
981
982// m_log.DebugFormat("[SCRIPT INSTANCE]: Did not find api {0} in {1}@{2}", name, ScriptName, PrimName);
983
970 return null; 984 return null;
971 } 985 }
972 986
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs
index bcdc7bf..797bce3 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs
@@ -55,6 +55,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
55 public static string Serialize(ScriptInstance instance) 55 public static string Serialize(ScriptInstance instance)
56 { 56 {
57 bool running = instance.Running; 57 bool running = instance.Running;
58 bool enabled = instance.Run;
58 59
59 XmlDocument xmldoc = new XmlDocument(); 60 XmlDocument xmldoc = new XmlDocument();
60 61
@@ -77,6 +78,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
77 78
78 rootElement.AppendChild(run); 79 rootElement.AppendChild(run);
79 80
81 XmlElement run_enable = xmldoc.CreateElement("", "Run", "");
82 run_enable.AppendChild(xmldoc.CreateTextNode(
83 enabled.ToString()));
84
85 rootElement.AppendChild(run_enable);
86
80 Dictionary<string, Object> vars = instance.GetVars(); 87 Dictionary<string, Object> vars = instance.GetVars();
81 88
82 XmlElement variables = xmldoc.CreateElement("", "Variables", ""); 89 XmlElement variables = xmldoc.CreateElement("", "Variables", "");
@@ -225,6 +232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
225 { 232 {
226 object varValue; 233 object varValue;
227 XmlNodeList partL = rootNode.ChildNodes; 234 XmlNodeList partL = rootNode.ChildNodes;
235 instance.Run = true;
228 236
229 foreach (XmlNode part in partL) 237 foreach (XmlNode part in partL)
230 { 238 {
@@ -236,6 +244,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
236 case "Running": 244 case "Running":
237 instance.Running=bool.Parse(part.InnerText); 245 instance.Running=bool.Parse(part.InnerText);
238 break; 246 break;
247 case "Run":
248 instance.Run = bool.Parse(part.InnerText);
249 break;
239 case "Variables": 250 case "Variables":
240 XmlNodeList varL = part.ChildNodes; 251 XmlNodeList varL = part.ChildNodes;
241 foreach (XmlNode var in varL) 252 foreach (XmlNode var in varL)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
index e2d0db2..c73e22f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
@@ -63,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
63 IConfig config = initConfigSource.AddConfig("XEngine"); 63 IConfig config = initConfigSource.AddConfig("XEngine");
64 config.Set("Enabled", "true"); 64 config.Set("Enabled", "true");
65 65
66 m_scene = SceneHelpers.SetupScene(); 66 m_scene = new SceneHelpers().SetupScene();
67 SceneHelpers.SetupSceneModules(m_scene, initConfigSource); 67 SceneHelpers.SetupSceneModules(m_scene, initConfigSource);
68 68
69 m_engine = new XEngine.XEngine(); 69 m_engine = new XEngine.XEngine();
@@ -91,7 +91,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
91 TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); 91 TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId);
92 92
93 LSL_Api api = new LSL_Api(); 93 LSL_Api api = new LSL_Api();
94 api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); 94 api.Initialize(m_engine, so1.RootPart, null);
95 95
96 // Create a second object 96 // Create a second object
97 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100); 97 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100);
@@ -124,7 +124,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
124 SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10); 124 SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10);
125 m_scene.AddSceneObject(so1); 125 m_scene.AddSceneObject(so1);
126 LSL_Api api = new LSL_Api(); 126 LSL_Api api = new LSL_Api();
127 api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); 127 api.Initialize(m_engine, so1.RootPart, null);
128 128
129 // Create an object embedded inside the first 129 // Create an object embedded inside the first
130 UUID itemId = TestHelpers.ParseTail(0x20); 130 UUID itemId = TestHelpers.ParseTail(0x20);
@@ -134,7 +134,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
134 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100); 134 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100);
135 m_scene.AddSceneObject(so2); 135 m_scene.AddSceneObject(so2);
136 LSL_Api api2 = new LSL_Api(); 136 LSL_Api api2 = new LSL_Api();
137 api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, so2.RootPart.UUID); 137 api2.Initialize(m_engine, so2.RootPart, null);
138 138
139 // *** Firstly, we test where llAllowInventoryDrop() has not been called. *** 139 // *** Firstly, we test where llAllowInventoryDrop() has not been called. ***
140 api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); 140 api.llGiveInventory(so2.UUID.ToString(), inventoryItemName);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs
new file mode 100644
index 0000000..2565ae7
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs
@@ -0,0 +1,142 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Text;
32using log4net;
33using Nini.Config;
34using NUnit.Framework;
35using OpenMetaverse;
36using OpenMetaverse.Assets;
37using OpenMetaverse.StructuredData;
38using OpenSim.Framework;
39using OpenSim.Region.CoreModules.Avatar.AvatarFactory;
40using OpenSim.Region.OptionalModules.World.NPC;
41using OpenSim.Region.Framework.Scenes;
42using OpenSim.Region.ScriptEngine.Shared;
43using OpenSim.Region.ScriptEngine.Shared.Api;
44using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
45using OpenSim.Services.Interfaces;
46using OpenSim.Tests.Common;
47using OpenSim.Tests.Common.Mock;
48
49namespace OpenSim.Region.ScriptEngine.Shared.Tests
50{
51 /// <summary>
52 /// Tests for linking functions in LSL
53 /// </summary>
54 /// <remarks>
55 /// This relates to LSL. Actual linking functionality should be tested in the main
56 /// OpenSim.Region.Framework.Scenes.Tests.SceneObjectLinkingTests.
57 /// </remarks>
58 [TestFixture]
59 public class LSL_ApiLinkingTests
60 {
61 protected Scene m_scene;
62 protected XEngine.XEngine m_engine;
63
64 [SetUp]
65 public void SetUp()
66 {
67 IConfigSource initConfigSource = new IniConfigSource();
68 IConfig config = initConfigSource.AddConfig("XEngine");
69 config.Set("Enabled", "true");
70
71 m_scene = new SceneHelpers().SetupScene();
72 SceneHelpers.SetupSceneModules(m_scene, initConfigSource);
73
74 m_engine = new XEngine.XEngine();
75 m_engine.Initialise(initConfigSource);
76 m_engine.AddRegion(m_scene);
77 }
78
79 [Test]
80 public void TestllCreateLink()
81 {
82 TestHelpers.InMethod();
83
84 UUID ownerId = TestHelpers.ParseTail(0x1);
85
86 SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10);
87 grp1.AbsolutePosition = new Vector3(10, 10, 10);
88 m_scene.AddSceneObject(grp1);
89
90 // FIXME: This should really be a script item (with accompanying script)
91 TaskInventoryItem grp1Item
92 = TaskInventoryHelpers.AddNotecard(
93 m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900));
94 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
95
96 SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20);
97 grp2.AbsolutePosition = new Vector3(20, 20, 20);
98
99 // <180,0,0>
100 grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0));
101
102 m_scene.AddSceneObject(grp2);
103
104 LSL_Api apiGrp1 = new LSL_Api();
105 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item);
106
107 apiGrp1.llCreateLink(grp2.UUID.ToString(), ScriptBaseClass.TRUE);
108
109 Assert.That(grp1.Parts.Length, Is.EqualTo(4));
110 Assert.That(grp2.IsDeleted, Is.True);
111 }
112
113 [Test]
114 public void TestllBreakLink()
115 {
116 TestHelpers.InMethod();
117
118 UUID ownerId = TestHelpers.ParseTail(0x1);
119
120 SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10);
121 grp1.AbsolutePosition = new Vector3(10, 10, 10);
122 m_scene.AddSceneObject(grp1);
123
124 // FIXME: This should really be a script item (with accompanying script)
125 TaskInventoryItem grp1Item
126 = TaskInventoryHelpers.AddNotecard(
127 m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900));
128
129 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
130
131 LSL_Api apiGrp1 = new LSL_Api();
132 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item);
133
134 apiGrp1.llBreakLink(2);
135
136 Assert.That(grp1.Parts.Length, Is.EqualTo(1));
137
138 SceneObjectGroup grp2 = m_scene.GetSceneObjectGroup("grp1-Part1");
139 Assert.That(grp2, Is.Not.Null);
140 }
141 }
142} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
index 9cf9258..c41d1e7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
@@ -58,16 +58,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
58 IConfig config = initConfigSource.AddConfig("XEngine"); 58 IConfig config = initConfigSource.AddConfig("XEngine");
59 config.Set("Enabled", "true"); 59 config.Set("Enabled", "true");
60 60
61 Scene scene = SceneHelpers.SetupScene(); 61 Scene scene = new SceneHelpers().SetupScene();
62 SceneObjectPart part = SceneHelpers.AddSceneObject(scene); 62 SceneObjectPart part = SceneHelpers.AddSceneObject(scene).RootPart;
63 63
64 XEngine.XEngine engine = new XEngine.XEngine(); 64 XEngine.XEngine engine = new XEngine.XEngine();
65 engine.Initialise(initConfigSource); 65 engine.Initialise(initConfigSource);
66 engine.AddRegion(scene); 66 engine.AddRegion(scene);
67 67
68 m_lslApi = new LSL_Api(); 68 m_lslApi = new LSL_Api();
69 m_lslApi.Initialize(engine, part, part.LocalId, part.UUID); 69 m_lslApi.Initialize(engine, part, null);
70
71 } 70 }
72 71
73 [Test] 72 [Test]
@@ -261,7 +260,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
261 TestHelpers.InMethod(); 260 TestHelpers.InMethod();
262 261
263 // Create Prim1. 262 // Create Prim1.
264 Scene scene = SceneHelpers.SetupScene(); 263 Scene scene = new SceneHelpers().SetupScene();
265 string obj1Name = "Prim1"; 264 string obj1Name = "Prim1";
266 UUID objUuid = new UUID("00000000-0000-0000-0000-000000000001"); 265 UUID objUuid = new UUID("00000000-0000-0000-0000-000000000001");
267 SceneObjectPart part1 = 266 SceneObjectPart part1 =
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
index 7573dff..c8718d9 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
@@ -67,7 +67,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
67 config = initConfigSource.AddConfig("NPC"); 67 config = initConfigSource.AddConfig("NPC");
68 config.Set("Enabled", "true"); 68 config.Set("Enabled", "true");
69 69
70 m_scene = SceneHelpers.SetupScene(); 70 m_scene = new SceneHelpers().SetupScene();
71 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); 71 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
72 72
73 m_engine = new XEngine.XEngine(); 73 m_engine = new XEngine.XEngine();
@@ -79,7 +79,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
79 /// Test creation of an NPC where the appearance data comes from a notecard 79 /// Test creation of an NPC where the appearance data comes from a notecard
80 /// </summary> 80 /// </summary>
81 [Test] 81 [Test]
82 public void TestOsNpcCreateFromNotecard() 82 public void TestOsNpcCreateUsingAppearanceFromNotecard()
83 { 83 {
84 TestHelpers.InMethod(); 84 TestHelpers.InMethod();
85// log4net.Config.XmlConfigurator.Configure(); 85// log4net.Config.XmlConfigurator.Configure();
@@ -90,12 +90,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
90 90
91 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); 91 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
92 sp.Appearance.AvatarHeight = newHeight; 92 sp.Appearance.AvatarHeight = newHeight;
93 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); 93 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
94 SceneObjectPart part = so.RootPart; 94 SceneObjectPart part = so.RootPart;
95 m_scene.AddSceneObject(so); 95 m_scene.AddSceneObject(so);
96 96
97 OSSL_Api osslApi = new OSSL_Api(); 97 OSSL_Api osslApi = new OSSL_Api();
98 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 98 osslApi.Initialize(m_engine, part, null);
99 99
100 string notecardName = "appearanceNc"; 100 string notecardName = "appearanceNc";
101 osslApi.osOwnerSaveAppearance(notecardName); 101 osslApi.osOwnerSaveAppearance(notecardName);
@@ -114,10 +114,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
114 /// Test creation of an NPC where the appearance data comes from an avatar already in the region. 114 /// Test creation of an NPC where the appearance data comes from an avatar already in the region.
115 /// </summary> 115 /// </summary>
116 [Test] 116 [Test]
117 public void TestOsNpcCreateFromAvatar() 117 public void TestOsNpcCreateUsingAppearanceFromAvatar()
118 { 118 {
119 TestHelpers.InMethod(); 119 TestHelpers.InMethod();
120// log4net.Config.XmlConfigurator.Configure(); 120// TestHelpers.EnableLogging();
121 121
122 // Store an avatar with a different height from default in a notecard. 122 // Store an avatar with a different height from default in a notecard.
123 UUID userId = TestHelpers.ParseTail(0x1); 123 UUID userId = TestHelpers.ParseTail(0x1);
@@ -125,12 +125,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
125 125
126 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); 126 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
127 sp.Appearance.AvatarHeight = newHeight; 127 sp.Appearance.AvatarHeight = newHeight;
128 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); 128 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
129 SceneObjectPart part = so.RootPart; 129 SceneObjectPart part = so.RootPart;
130 m_scene.AddSceneObject(so); 130 m_scene.AddSceneObject(so);
131 131
132 OSSL_Api osslApi = new OSSL_Api(); 132 OSSL_Api osslApi = new OSSL_Api();
133 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 133 osslApi.Initialize(m_engine, part, null);
134 134
135 string notecardName = "appearanceNc"; 135 string notecardName = "appearanceNc";
136 osslApi.osOwnerSaveAppearance(notecardName); 136 osslApi.osOwnerSaveAppearance(notecardName);
@@ -156,12 +156,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
156 156
157 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); 157 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
158 sp.Appearance.AvatarHeight = newHeight; 158 sp.Appearance.AvatarHeight = newHeight;
159 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); 159 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
160 SceneObjectPart part = so.RootPart; 160 SceneObjectPart part = so.RootPart;
161 m_scene.AddSceneObject(so); 161 m_scene.AddSceneObject(so);
162 162
163 OSSL_Api osslApi = new OSSL_Api(); 163 OSSL_Api osslApi = new OSSL_Api();
164 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 164 osslApi.Initialize(m_engine, part, null);
165 165
166 string notecardName = "appearanceNc"; 166 string notecardName = "appearanceNc";
167 167
@@ -197,12 +197,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
197 197
198 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, nonOwnerId); 198 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, nonOwnerId);
199 sp.Appearance.AvatarHeight = newHeight; 199 sp.Appearance.AvatarHeight = newHeight;
200 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, ownerId); 200 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, ownerId, 0x10);
201 SceneObjectPart part = so.RootPart; 201 SceneObjectPart part = so.RootPart;
202 m_scene.AddSceneObject(so); 202 m_scene.AddSceneObject(so);
203 203
204 OSSL_Api osslApi = new OSSL_Api(); 204 OSSL_Api osslApi = new OSSL_Api();
205 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 205 osslApi.Initialize(m_engine, part, null);
206 206
207 string notecardName = "appearanceNc"; 207 string notecardName = "appearanceNc";
208 208
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs
new file mode 100644
index 0000000..5ed1f3d
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs
@@ -0,0 +1,231 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Text;
32using log4net;
33using Nini.Config;
34using NUnit.Framework;
35using OpenMetaverse;
36using OpenMetaverse.Assets;
37using OpenMetaverse.StructuredData;
38using OpenSim.Framework;
39using OpenSim.Region.CoreModules.Avatar.Attachments;
40using OpenSim.Region.CoreModules.Framework.InventoryAccess;
41using OpenSim.Region.Framework.Scenes;
42using OpenSim.Region.ScriptEngine.Shared;
43using OpenSim.Region.ScriptEngine.Shared.Api;
44using OpenSim.Services.Interfaces;
45using OpenSim.Tests.Common;
46using OpenSim.Tests.Common.Mock;
47
48namespace OpenSim.Region.ScriptEngine.Shared.Tests
49{
50 /// <summary>
51 /// Tests for OSSL attachment functions
52 /// </summary>
53 /// <remarks>
54 /// TODO: Add tests for all functions
55 /// </remarks>
56 [TestFixture]
57 public class OSSL_ApiAttachmentTests : OpenSimTestCase
58 {
59 protected Scene m_scene;
60 protected XEngine.XEngine m_engine;
61
62 [SetUp]
63 public override void SetUp()
64 {
65 base.SetUp();
66
67 IConfigSource initConfigSource = new IniConfigSource();
68
69 IConfig xengineConfig = initConfigSource.AddConfig("XEngine");
70 xengineConfig.Set("Enabled", "true");
71 xengineConfig.Set("AllowOSFunctions", "true");
72 xengineConfig.Set("OSFunctionThreatLevel", "Severe");
73
74 IConfig modulesConfig = initConfigSource.AddConfig("Modules");
75 modulesConfig.Set("InventoryAccessModule", "BasicInventoryAccessModule");
76
77 m_scene = new SceneHelpers().SetupScene();
78 SceneHelpers.SetupSceneModules(
79 m_scene, initConfigSource, new AttachmentsModule(), new BasicInventoryAccessModule());
80
81 m_engine = new XEngine.XEngine();
82 m_engine.Initialise(initConfigSource);
83 m_engine.AddRegion(m_scene);
84 }
85
86 [Test]
87 public void TestOsForceAttachToAvatarFromInventory()
88 {
89 TestHelpers.InMethod();
90// TestHelpers.EnableLogging();
91
92 string taskInvObjItemName = "sphere";
93 UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000");
94 AttachmentPoint attachPoint = AttachmentPoint.Chin;
95
96 UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, 0x1);
97 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1.PrincipalID);
98 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID);
99 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart);
100
101 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem);
102 OSSL_Api osslApi = new OSSL_Api();
103 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem);
104
105// SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, ua1.PrincipalID);
106
107 // Create an object embedded inside the first
108 TaskInventoryHelpers.AddSceneObject(m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, ua1.PrincipalID);
109
110 osslApi.osForceAttachToAvatarFromInventory(taskInvObjItemName, (int)attachPoint);
111
112 // Check scene presence status
113 Assert.That(sp.HasAttachments(), Is.True);
114 List<SceneObjectGroup> attachments = sp.GetAttachments();
115 Assert.That(attachments.Count, Is.EqualTo(1));
116 SceneObjectGroup attSo = attachments[0];
117 Assert.That(attSo.Name, Is.EqualTo(taskInvObjItemName));
118 Assert.That(attSo.AttachmentPoint, Is.EqualTo((uint)attachPoint));
119 Assert.That(attSo.IsAttachment);
120 Assert.That(attSo.UsesPhysics, Is.False);
121 Assert.That(attSo.IsTemporary, Is.False);
122
123 // Check appearance status
124 List<AvatarAttachment> attachmentsInAppearance = sp.Appearance.GetAttachments();
125 Assert.That(attachmentsInAppearance.Count, Is.EqualTo(1));
126 Assert.That(sp.Appearance.GetAttachpoint(attachmentsInAppearance[0].ItemID), Is.EqualTo((uint)attachPoint));
127 }
128
129 /// <summary>
130 /// Make sure we can't force attach anything other than objects.
131 /// </summary>
132 [Test]
133 public void TestOsForceAttachToAvatarFromInventoryNotObject()
134 {
135 TestHelpers.InMethod();
136// TestHelpers.EnableLogging();
137
138 string taskInvObjItemName = "sphere";
139 UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000");
140 AttachmentPoint attachPoint = AttachmentPoint.Chin;
141
142 UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, 0x1);
143 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1.PrincipalID);
144 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID);
145 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart);
146
147 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem);
148 OSSL_Api osslApi = new OSSL_Api();
149 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem);
150
151 // Create an object embedded inside the first
152 TaskInventoryHelpers.AddNotecard(
153 m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, TestHelpers.ParseTail(0x900));
154
155 bool exceptionCaught = false;
156
157 try
158 {
159 osslApi.osForceAttachToAvatarFromInventory(taskInvObjItemName, (int)attachPoint);
160 }
161 catch (Exception)
162 {
163 exceptionCaught = true;
164 }
165
166 Assert.That(exceptionCaught, Is.True);
167
168 // Check scene presence status
169 Assert.That(sp.HasAttachments(), Is.False);
170 List<SceneObjectGroup> attachments = sp.GetAttachments();
171 Assert.That(attachments.Count, Is.EqualTo(0));
172
173 // Check appearance status
174 List<AvatarAttachment> attachmentsInAppearance = sp.Appearance.GetAttachments();
175 Assert.That(attachmentsInAppearance.Count, Is.EqualTo(0));
176 }
177
178 [Test]
179 public void TestOsForceAttachToOtherAvatarFromInventory()
180 {
181 TestHelpers.InMethod();
182// TestHelpers.EnableLogging();
183
184 string taskInvObjItemName = "sphere";
185 UUID taskInvObjItemId = UUID.Parse("00000000-0000-0000-0000-100000000000");
186 AttachmentPoint attachPoint = AttachmentPoint.Chin;
187
188 UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_scene, "user", "one", 0x1, "pass");
189 UserAccount ua2 = UserAccountHelpers.CreateUserWithInventory(m_scene, "user", "two", 0x2, "pass");
190
191 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, ua1);
192 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID);
193 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart);
194
195 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem);
196 OSSL_Api osslApi = new OSSL_Api();
197 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem);
198
199 // Create an object embedded inside the first
200 TaskInventoryHelpers.AddSceneObject(m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, ua1.PrincipalID);
201
202 ScenePresence sp2 = SceneHelpers.AddScenePresence(m_scene, ua2);
203
204 osslApi.osForceAttachToOtherAvatarFromInventory(sp2.UUID.ToString(), taskInvObjItemName, (int)attachPoint);
205
206 // Check scene presence status
207 Assert.That(sp.HasAttachments(), Is.False);
208 List<SceneObjectGroup> attachments = sp.GetAttachments();
209 Assert.That(attachments.Count, Is.EqualTo(0));
210
211 Assert.That(sp2.HasAttachments(), Is.True);
212 List<SceneObjectGroup> attachments2 = sp2.GetAttachments();
213 Assert.That(attachments2.Count, Is.EqualTo(1));
214 SceneObjectGroup attSo = attachments2[0];
215 Assert.That(attSo.Name, Is.EqualTo(taskInvObjItemName));
216 Assert.That(attSo.OwnerID, Is.EqualTo(ua2.PrincipalID));
217 Assert.That(attSo.AttachmentPoint, Is.EqualTo((uint)attachPoint));
218 Assert.That(attSo.IsAttachment);
219 Assert.That(attSo.UsesPhysics, Is.False);
220 Assert.That(attSo.IsTemporary, Is.False);
221
222 // Check appearance status
223 List<AvatarAttachment> attachmentsInAppearance = sp.Appearance.GetAttachments();
224 Assert.That(attachmentsInAppearance.Count, Is.EqualTo(0));
225
226 List<AvatarAttachment> attachmentsInAppearance2 = sp2.Appearance.GetAttachments();
227 Assert.That(attachmentsInAppearance2.Count, Is.EqualTo(1));
228 Assert.That(sp2.Appearance.GetAttachpoint(attachmentsInAppearance2[0].ItemID), Is.EqualTo((uint)attachPoint));
229 }
230 }
231} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index 9d9fc51..25679a6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -52,14 +52,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
52 /// Tests for OSSL NPC API 52 /// Tests for OSSL NPC API
53 /// </summary> 53 /// </summary>
54 [TestFixture] 54 [TestFixture]
55 public class OSSL_NpcApiAppearanceTest 55 public class OSSL_NpcApiAppearanceTest : OpenSimTestCase
56 { 56 {
57 protected Scene m_scene; 57 protected Scene m_scene;
58 protected XEngine.XEngine m_engine; 58 protected XEngine.XEngine m_engine;
59 59
60 [SetUp] 60 [SetUp]
61 public void SetUp() 61 public override void SetUp()
62 { 62 {
63 base.SetUp();
64
63 IConfigSource initConfigSource = new IniConfigSource(); 65 IConfigSource initConfigSource = new IniConfigSource();
64 IConfig config = initConfigSource.AddConfig("XEngine"); 66 IConfig config = initConfigSource.AddConfig("XEngine");
65 config.Set("Enabled", "true"); 67 config.Set("Enabled", "true");
@@ -68,7 +70,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
68 config = initConfigSource.AddConfig("NPC"); 70 config = initConfigSource.AddConfig("NPC");
69 config.Set("Enabled", "true"); 71 config.Set("Enabled", "true");
70 72
71 m_scene = SceneHelpers.SetupScene(); 73 m_scene = new SceneHelpers().SetupScene();
72 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); 74 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
73 75
74 m_engine = new XEngine.XEngine(); 76 m_engine = new XEngine.XEngine();
@@ -95,19 +97,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
95 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); 97 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
96 sp.Appearance.AvatarHeight = newHeight; 98 sp.Appearance.AvatarHeight = newHeight;
97 99
98 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); 100 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
99 SceneObjectPart part = so.RootPart; 101 SceneObjectPart part = so.RootPart;
100 m_scene.AddSceneObject(so); 102 m_scene.AddSceneObject(so);
101 103
102 SceneObjectGroup otherSo = SceneHelpers.CreateSceneObject(1, otherUserId); 104 SceneObjectGroup otherSo = SceneHelpers.CreateSceneObject(1, otherUserId, 0x20);
103 SceneObjectPart otherPart = otherSo.RootPart; 105 SceneObjectPart otherPart = otherSo.RootPart;
104 m_scene.AddSceneObject(otherSo); 106 m_scene.AddSceneObject(otherSo);
105 107
106 OSSL_Api osslApi = new OSSL_Api(); 108 OSSL_Api osslApi = new OSSL_Api();
107 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 109 osslApi.Initialize(m_engine, part, null);
108 110
109 OSSL_Api otherOsslApi = new OSSL_Api(); 111 OSSL_Api otherOsslApi = new OSSL_Api();
110 otherOsslApi.Initialize(m_engine, otherPart, otherPart.LocalId, otherPart.UUID); 112 otherOsslApi.Initialize(m_engine, otherPart, null);
111 113
112 string notecardName = "appearanceNc"; 114 string notecardName = "appearanceNc";
113 osslApi.osOwnerSaveAppearance(notecardName); 115 osslApi.osOwnerSaveAppearance(notecardName);
@@ -146,12 +148,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
146 148
147 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId); 149 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, userId);
148 sp.Appearance.AvatarHeight = newHeight; 150 sp.Appearance.AvatarHeight = newHeight;
149 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId); 151 SceneObjectGroup so = SceneHelpers.CreateSceneObject(1, userId, 0x10);
150 SceneObjectPart part = so.RootPart; 152 SceneObjectPart part = so.RootPart;
151 m_scene.AddSceneObject(so); 153 m_scene.AddSceneObject(so);
152 154
153 OSSL_Api osslApi = new OSSL_Api(); 155 OSSL_Api osslApi = new OSSL_Api();
154 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 156 osslApi.Initialize(m_engine, part, null);
155 157
156 string notecardName = "appearanceNc"; 158 string notecardName = "appearanceNc";
157 osslApi.osOwnerSaveAppearance(notecardName); 159 osslApi.osOwnerSaveAppearance(notecardName);
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
index 7d7bd82..f247a0b 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
@@ -58,9 +58,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
58// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory); 58// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
59 m_xEngine = new XEngine(); 59 m_xEngine = new XEngine();
60 60
61 // Necessary to stop serialization complaining
62 WorldCommModule wcModule = new WorldCommModule();
63
64 IniConfigSource configSource = new IniConfigSource(); 61 IniConfigSource configSource = new IniConfigSource();
65 62
66 IConfig startupConfig = configSource.AddConfig("Startup"); 63 IConfig startupConfig = configSource.AddConfig("Startup");
@@ -68,13 +65,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
68 65
69 IConfig xEngineConfig = configSource.AddConfig("XEngine"); 66 IConfig xEngineConfig = configSource.AddConfig("XEngine");
70 xEngineConfig.Set("Enabled", "true"); 67 xEngineConfig.Set("Enabled", "true");
68 xEngineConfig.Set("StartDelay", "0");
71 69
72 // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call 70 // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call
73 // to AssemblyResolver.OnAssemblyResolve fails. 71 // to AssemblyResolver.OnAssemblyResolve fails.
74 xEngineConfig.Set("AppDomainLoading", "false"); 72 xEngineConfig.Set("AppDomainLoading", "false");
75 73
76 m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); 74 m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource);
77 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); 75 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine);
78 m_scene.StartScripts(); 76 m_scene.StartScripts();
79 } 77 }
80 78
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 2a01fc4..d763063 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -63,6 +63,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
63 { 63 {
64 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 64 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
65 65
66 /// <summary>
67 /// Control the printing of certain debug messages.
68 /// </summary>
69 /// <remarks>
70 /// If DebugLevel >= 1, then we log every time that a script is started.
71 /// </remarks>
72// public int DebugLevel { get; set; }
73
66 private SmartThreadPool m_ThreadPool; 74 private SmartThreadPool m_ThreadPool;
67 private int m_MaxScriptQueue; 75 private int m_MaxScriptQueue;
68 private Scene m_Scene; 76 private Scene m_Scene;
@@ -70,7 +78,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
70 private IConfigSource m_ConfigSource = null; 78 private IConfigSource m_ConfigSource = null;
71 private ICompiler m_Compiler; 79 private ICompiler m_Compiler;
72 private int m_MinThreads; 80 private int m_MinThreads;
73 private int m_MaxThreads ; 81 private int m_MaxThreads;
82
83 /// <summary>
84 /// Amount of time to delay before starting.
85 /// </summary>
86 private int m_StartDelay;
87
74 private int m_IdleTimeout; 88 private int m_IdleTimeout;
75 private int m_StackSize; 89 private int m_StackSize;
76 private int m_SleepTime; 90 private int m_SleepTime;
@@ -284,14 +298,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
284 AppDomain.CurrentDomain.AssemblyResolve += 298 AppDomain.CurrentDomain.AssemblyResolve +=
285 OnAssemblyResolve; 299 OnAssemblyResolve;
286 300
287 m_log.InfoFormat("[XEngine] Initializing scripts in region {0}",
288 scene.RegionInfo.RegionName);
289 m_Scene = scene; 301 m_Scene = scene;
302 m_log.InfoFormat("[XEngine]: Initializing scripts in region {0}", m_Scene.RegionInfo.RegionName);
290 303
291 m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2); 304 m_MinThreads = m_ScriptConfig.GetInt("MinThreads", 2);
292 m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100); 305 m_MaxThreads = m_ScriptConfig.GetInt("MaxThreads", 100);
293 m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60); 306 m_IdleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60);
294 string priority = m_ScriptConfig.GetString("Priority", "BelowNormal"); 307 string priority = m_ScriptConfig.GetString("Priority", "BelowNormal");
308 m_StartDelay = m_ScriptConfig.GetInt("StartDelay", 15000);
295 m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300); 309 m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300);
296 m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144); 310 m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144);
297 m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000; 311 m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000;
@@ -389,9 +403,42 @@ namespace OpenSim.Region.ScriptEngine.XEngine
389 "Starts all stopped scripts." 403 "Starts all stopped scripts."
390 + "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.", 404 + "If a <script-item-uuid> is given then only that script will be started. Otherwise, all suitable scripts are started.",
391 (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript)); 405 (module, cmdparams) => HandleScriptsAction(cmdparams, HandleStartScript));
406
407// MainConsole.Instance.Commands.AddCommand(
408// "Debug", false, "debug xengine", "debug xengine [<level>]",
409// "Turn on detailed xengine debugging.",
410// "If level <= 0, then no extra logging is done.\n"
411// + "If level >= 1, then we log every time that a script is started.",
412// HandleDebugLevelCommand);
392 } 413 }
393 414
394 /// <summary> 415 /// <summary>
416 /// Change debug level
417 /// </summary>
418 /// <param name="module"></param>
419 /// <param name="args"></param>
420// private void HandleDebugLevelCommand(string module, string[] args)
421// {
422// if (args.Length == 3)
423// {
424// int newDebug;
425// if (int.TryParse(args[2], out newDebug))
426// {
427// DebugLevel = newDebug;
428// MainConsole.Instance.OutputFormat("Debug level set to {0}", newDebug);
429// }
430// }
431// else if (args.Length == 2)
432// {
433// MainConsole.Instance.OutputFormat("Current debug level is {0}", DebugLevel);
434// }
435// else
436// {
437// MainConsole.Instance.Output("Usage: debug xengine 0..1");
438// }
439// }
440
441 /// <summary>
395 /// Parse the raw item id into a script instance from the command params if it's present. 442 /// Parse the raw item id into a script instance from the command params if it's present.
396 /// </summary> 443 /// </summary>
397 /// <param name="cmdparams"></param> 444 /// <param name="cmdparams"></param>
@@ -799,35 +846,66 @@ namespace OpenSim.Region.ScriptEngine.XEngine
799 int colon = firstline.IndexOf(':'); 846 int colon = firstline.IndexOf(':');
800 if (firstline.Length > 2 && firstline.Substring(0, 2) == "//" && colon != -1) 847 if (firstline.Length > 2 && firstline.Substring(0, 2) == "//" && colon != -1)
801 { 848 {
802 string engineName = firstline.Substring(2, colon-2); 849 string engineName = firstline.Substring(2, colon - 2);
803 850
804 if (names.Contains(engineName)) 851 if (names.Contains(engineName))
805 { 852 {
806 engine = engineName; 853 engine = engineName;
807 script = "//" + script.Substring(script.IndexOf(':')+1); 854 script = "//" + script.Substring(colon + 1);
808 } 855 }
809 else 856 else
810 { 857 {
811 if (engine == ScriptEngineName) 858 if (engine == ScriptEngineName)
812 { 859 {
813 SceneObjectPart part = 860 // If we are falling back on XEngine as the default engine, then only complain to the user
814 m_Scene.GetSceneObjectPart( 861 // if a script language has been explicitly set and it's one that we recognize or there are
815 localID); 862 // no non-whitespace characters after the colon.
816 863 //
817 TaskInventoryItem item = 864 // If the script is
818 part.Inventory.GetInventoryItem(itemID); 865 // explicitly not allowed or the script is not in LSL then the user will be informed by a later compiler message.
819 866 //
820 ScenePresence presence = 867 // If the colon ends the line then we'll risk the false positive as this is more likely
821 m_Scene.GetScenePresence( 868 // to signal a real scriptengine line where the user wants to use the default compile language.
822 item.OwnerID); 869 //
823 870 // This avoids the overwhelming number of false positives where we're in this code because
824 if (presence != null) 871 // there's a colon in a comment in the first line of a script for entirely
872 // unrelated reasons (e.g. vim settings).
873 //
874 // TODO: A better fix would be to deprecate simple : detection and look for some less likely
875 // string to begin the comment (like #! in unix shell scripts).
876 bool warnRunningInXEngine = false;
877 string restOfFirstLine = firstline.Substring(colon + 1);
878
879 // FIXME: These are hardcoded because they are currently hardcoded in Compiler.cs
880 if (restOfFirstLine.StartsWith("c#")
881 || restOfFirstLine.StartsWith("vb")
882 || restOfFirstLine.StartsWith("lsl")
883 || restOfFirstLine.StartsWith("js")
884 || restOfFirstLine.StartsWith("yp")
885 || restOfFirstLine.Length == 0)
886 warnRunningInXEngine = true;
887
888 if (warnRunningInXEngine)
825 { 889 {
826 presence.ControllingClient.SendAgentAlertMessage( 890 SceneObjectPart part =
827 "Selected engine unavailable. "+ 891 m_Scene.GetSceneObjectPart(
828 "Running script on "+ 892 localID);
829 ScriptEngineName, 893
830 false); 894 TaskInventoryItem item =
895 part.Inventory.GetInventoryItem(itemID);
896
897 ScenePresence presence =
898 m_Scene.GetScenePresence(
899 item.OwnerID);
900
901 if (presence != null)
902 {
903 presence.ControllingClient.SendAgentAlertMessage(
904 "Selected engine unavailable. "+
905 "Running script on "+
906 ScriptEngineName,
907 false);
908 }
831 } 909 }
832 } 910 }
833 } 911 }
@@ -884,20 +962,31 @@ namespace OpenSim.Region.ScriptEngine.XEngine
884 { 962 {
885 if (m_InitialStartup) 963 if (m_InitialStartup)
886 { 964 {
887 m_InitialStartup = false; 965 // This delay exists to stop mono problems where script compilation and startup would stop the sim
888 System.Threading.Thread.Sleep(15000); 966 // working properly for the session.
967 System.Threading.Thread.Sleep(m_StartDelay);
968 }
889 969
890 if (m_CompileQueue.Count == 0) 970 object[] o;
971
972 int scriptsStarted = 0;
973
974 while (m_CompileQueue.Dequeue(out o))
975 {
976 if (DoOnRezScript(o))
891 { 977 {
892 // No scripts on region, so won't get triggered later 978 scriptsStarted++;
893 // by the queue becoming empty so we trigger it here 979
894 m_Scene.EventManager.TriggerEmptyScriptCompileQueue(0, String.Empty); 980 if (m_InitialStartup)
981 if (scriptsStarted % 50 == 0)
982 m_log.InfoFormat(
983 "[XEngine]: Started {0} scripts in {1}", scriptsStarted, m_Scene.RegionInfo.RegionName);
895 } 984 }
896 } 985 }
897 986
898 object[] o; 987 if (m_InitialStartup)
899 while (m_CompileQueue.Dequeue(out o)) 988 m_log.InfoFormat(
900 DoOnRezScript(o); 989 "[XEngine]: Completed starting {0} scripts on {1}", scriptsStarted, m_Scene.RegionInfo.RegionName);
901 990
902 // NOTE: Despite having a lockless queue, this lock is required 991 // NOTE: Despite having a lockless queue, this lock is required
903 // to make sure there is never no compile thread while there 992 // to make sure there is never no compile thread while there
@@ -905,12 +994,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
905 // due to a race condition 994 // due to a race condition
906 // 995 //
907 lock (m_CompileQueue) 996 lock (m_CompileQueue)
908 {
909 m_CurrentCompile = null; 997 m_CurrentCompile = null;
910 } 998
911 m_Scene.EventManager.TriggerEmptyScriptCompileQueue(m_ScriptFailCount, 999 m_Scene.EventManager.TriggerEmptyScriptCompileQueue(m_ScriptFailCount,
912 m_ScriptErrorMessage); 1000 m_ScriptErrorMessage);
1001
913 m_ScriptFailCount = 0; 1002 m_ScriptFailCount = 0;
1003 m_InitialStartup = false;
914 1004
915 return null; 1005 return null;
916 } 1006 }
@@ -1093,11 +1183,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1093 1183
1094 AppDomain sandbox; 1184 AppDomain sandbox;
1095 if (m_AppDomainLoading) 1185 if (m_AppDomainLoading)
1186 {
1096 sandbox = AppDomain.CreateDomain( 1187 sandbox = AppDomain.CreateDomain(
1097 m_Scene.RegionInfo.RegionID.ToString(), 1188 m_Scene.RegionInfo.RegionID.ToString(),
1098 evidence, appSetup); 1189 evidence, appSetup);
1190 m_AppDomains[appDomain].AssemblyResolve +=
1191 new ResolveEventHandler(
1192 AssemblyResolver.OnAssemblyResolve);
1193 }
1099 else 1194 else
1195 {
1100 sandbox = AppDomain.CurrentDomain; 1196 sandbox = AppDomain.CurrentDomain;
1197 }
1101 1198
1102 //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel(); 1199 //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel();
1103 //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition(); 1200 //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition();
@@ -1109,9 +1206,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1109 1206
1110 m_AppDomains[appDomain] = sandbox; 1207 m_AppDomains[appDomain] = sandbox;
1111 1208
1112 m_AppDomains[appDomain].AssemblyResolve +=
1113 new ResolveEventHandler(
1114 AssemblyResolver.OnAssemblyResolve);
1115 m_DomainScripts[appDomain] = new List<UUID>(); 1209 m_DomainScripts[appDomain] = new List<UUID>();
1116 } 1210 }
1117 catch (Exception e) 1211 catch (Exception e)
@@ -1396,25 +1490,24 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1396 return false; 1490 return false;
1397 1491
1398 uuids = m_PrimObjects[localID]; 1492 uuids = m_PrimObjects[localID];
1399
1400 1493
1401 foreach (UUID itemID in uuids) 1494 foreach (UUID itemID in uuids)
1402 {
1403 IScriptInstance instance = null;
1404 try
1405 { 1495 {
1406 if (m_Scripts.ContainsKey(itemID)) 1496 IScriptInstance instance = null;
1407 instance = m_Scripts[itemID]; 1497 try
1408 } 1498 {
1409 catch { /* ignore race conditions */ } 1499 if (m_Scripts.ContainsKey(itemID))
1410 1500 instance = m_Scripts[itemID];
1411 if (instance != null) 1501 }
1412 { 1502 catch { /* ignore race conditions */ }
1413 instance.PostEvent(p); 1503
1414 result = true; 1504 if (instance != null)
1505 {
1506 instance.PostEvent(p);
1507 result = true;
1508 }
1415 } 1509 }
1416 } 1510 }
1417 }
1418 1511
1419 return result; 1512 return result;
1420 } 1513 }
@@ -1539,6 +1632,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1539 } 1632 }
1540 } 1633 }
1541 1634
1635 public void SetRunEnable(UUID instanceID, bool enable)
1636 {
1637 IScriptInstance instance = GetInstance(instanceID);
1638 if (instance != null)
1639 instance.Run = enable;
1640 }
1641
1542 public bool GetScriptState(UUID itemID) 1642 public bool GetScriptState(UUID itemID)
1543 { 1643 {
1544 IScriptInstance instance = GetInstance(itemID); 1644 IScriptInstance instance = GetInstance(itemID);
@@ -1573,7 +1673,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1573 { 1673 {
1574 IScriptInstance instance = GetInstance(itemID); 1674 IScriptInstance instance = GetInstance(itemID);
1575 if (instance != null) 1675 if (instance != null)
1576 instance.Stop(0); 1676 {
1677 // Give the script some time to finish processing its last event. Simply aborting the script thread can
1678 // cause issues on mono 2.6, 2.10 and possibly later where locks are not released properly on abort.
1679 instance.Stop(1000);
1680 }
1577 } 1681 }
1578 1682
1579 public DetectParams GetDetectParams(UUID itemID, int idx) 1683 public DetectParams GetDetectParams(UUID itemID, int idx)
@@ -1671,12 +1775,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1671 1775
1672 public string GetXMLState(UUID itemID) 1776 public string GetXMLState(UUID itemID)
1673 { 1777 {
1674// m_log.DebugFormat("[XEngine]: Getting XML state for {0}", itemID); 1778// m_log.DebugFormat("[XEngine]: Getting XML state for script instance {0}", itemID);
1675 1779
1676 IScriptInstance instance = GetInstance(itemID); 1780 IScriptInstance instance = GetInstance(itemID);
1677 if (instance == null) 1781 if (instance == null)
1678 { 1782 {
1679// m_log.DebugFormat("[XEngine]: Found no script for {0}, returning empty string", itemID); 1783// m_log.DebugFormat("[XEngine]: Found no script instance for {0}, returning empty string", itemID);
1680 return ""; 1784 return "";
1681 } 1785 }
1682 1786
@@ -1749,14 +1853,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1749 FileMode.Open, FileAccess.Read)) 1853 FileMode.Open, FileAccess.Read))
1750 { 1854 {
1751 tfs.Read(tdata, 0, tdata.Length); 1855 tfs.Read(tdata, 0, tdata.Length);
1752 tfs.Close();
1753 } 1856 }
1754 1857
1755 assem = new System.Text.ASCIIEncoding().GetString(tdata); 1858 assem = Encoding.ASCII.GetString(tdata);
1756 } 1859 }
1757 catch (Exception e) 1860 catch (Exception e)
1758 { 1861 {
1759 m_log.DebugFormat("[XEngine]: Unable to open script textfile {0}, reason: {1}", assemName+".text", e.Message); 1862 m_log.ErrorFormat(
1863 "[XEngine]: Unable to open script textfile {0}{1}, reason: {2}",
1864 assemName, ".text", e.Message);
1760 } 1865 }
1761 } 1866 }
1762 } 1867 }
@@ -1773,16 +1878,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1773 using (FileStream fs = File.Open(assemName, FileMode.Open, FileAccess.Read)) 1878 using (FileStream fs = File.Open(assemName, FileMode.Open, FileAccess.Read))
1774 { 1879 {
1775 fs.Read(data, 0, data.Length); 1880 fs.Read(data, 0, data.Length);
1776 fs.Close();
1777 } 1881 }
1778 1882
1779 assem = System.Convert.ToBase64String(data); 1883 assem = System.Convert.ToBase64String(data);
1780 } 1884 }
1781 catch (Exception e) 1885 catch (Exception e)
1782 { 1886 {
1783 m_log.DebugFormat("[XEngine]: Unable to open script assembly {0}, reason: {1}", assemName, e.Message); 1887 m_log.ErrorFormat(
1888 "[XEngine]: Unable to open script assembly {0}, reason: {1}", assemName, e.Message);
1784 } 1889 }
1785
1786 } 1890 }
1787 } 1891 }
1788 1892
@@ -1795,9 +1899,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1795 using (StreamReader msr = new StreamReader(mfs)) 1899 using (StreamReader msr = new StreamReader(mfs))
1796 { 1900 {
1797 map = msr.ReadToEnd(); 1901 map = msr.ReadToEnd();
1798 msr.Close();
1799 } 1902 }
1800 mfs.Close();
1801 } 1903 }
1802 } 1904 }
1803 1905
@@ -1833,6 +1935,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1833 1935
1834 public bool SetXMLState(UUID itemID, string xml) 1936 public bool SetXMLState(UUID itemID, string xml)
1835 { 1937 {
1938// m_log.DebugFormat("[XEngine]: Writing state for script item with ID {0}", itemID);
1939
1836 if (xml == String.Empty) 1940 if (xml == String.Empty)
1837 return false; 1941 return false;
1838 1942
@@ -1893,31 +1997,61 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1893 { 1997 {
1894 using (FileStream fs = File.Create(path)) 1998 using (FileStream fs = File.Create(path))
1895 { 1999 {
2000// m_log.DebugFormat("[XEngine]: Writing assembly file {0}", path);
2001
1896 fs.Write(filedata, 0, filedata.Length); 2002 fs.Write(filedata, 0, filedata.Length);
1897 fs.Close();
1898 } 2003 }
1899 } 2004 }
1900 catch (IOException ex) 2005 catch (IOException ex)
1901 { 2006 {
1902 // if there already exists a file at that location, it may be locked. 2007 // if there already exists a file at that location, it may be locked.
1903 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); 2008 m_log.ErrorFormat("[XEngine]: Error whilst writing assembly file {0}, {1}", path, ex.Message);
1904 } 2009 }
2010
2011 string textpath = path + ".text";
1905 try 2012 try
1906 { 2013 {
1907 using (FileStream fs = File.Create(path + ".text")) 2014 using (FileStream fs = File.Create(textpath))
1908 { 2015 {
1909 using (StreamWriter sw = new StreamWriter(fs)) 2016 using (StreamWriter sw = new StreamWriter(fs))
1910 { 2017 {
2018// m_log.DebugFormat("[XEngine]: Writing .text file {0}", textpath);
2019
1911 sw.Write(base64); 2020 sw.Write(base64);
1912 sw.Close();
1913 } 2021 }
1914 fs.Close();
1915 } 2022 }
1916 } 2023 }
1917 catch (IOException ex) 2024 catch (IOException ex)
1918 { 2025 {
1919 // if there already exists a file at that location, it may be locked. 2026 // if there already exists a file at that location, it may be locked.
1920 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); 2027 m_log.ErrorFormat("[XEngine]: Error whilst writing .text file {0}, {1}", textpath, ex.Message);
2028 }
2029 }
2030
2031 XmlNodeList mapL = rootE.GetElementsByTagName("LineMap");
2032 if (mapL.Count > 0)
2033 {
2034 XmlElement mapE = (XmlElement)mapL[0];
2035
2036 string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString());
2037 mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
2038
2039 try
2040 {
2041 using (FileStream mfs = File.Create(mappath))
2042 {
2043 using (StreamWriter msw = new StreamWriter(mfs))
2044 {
2045 // m_log.DebugFormat("[XEngine]: Writing linemap file {0}", mappath);
2046
2047 msw.Write(mapE.InnerText);
2048 }
2049 }
2050 }
2051 catch (IOException ex)
2052 {
2053 // if there already exists a file at that location, it may be locked.
2054 m_log.ErrorFormat("[XEngine]: Linemap file {0} already exists! {1}", mappath, ex.Message);
1921 } 2055 }
1922 } 2056 }
1923 } 2057 }
@@ -1931,43 +2065,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1931 { 2065 {
1932 using (StreamWriter ssw = new StreamWriter(sfs)) 2066 using (StreamWriter ssw = new StreamWriter(sfs))
1933 { 2067 {
2068// m_log.DebugFormat("[XEngine]: Writing state file {0}", statepath);
2069
1934 ssw.Write(stateE.OuterXml); 2070 ssw.Write(stateE.OuterXml);
1935 ssw.Close();
1936 } 2071 }
1937 sfs.Close();
1938 } 2072 }
1939 } 2073 }
1940 catch (IOException ex) 2074 catch (IOException ex)
1941 { 2075 {
1942 // if there already exists a file at that location, it may be locked. 2076 // if there already exists a file at that location, it may be locked.
1943 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message); 2077 m_log.ErrorFormat("[XEngine]: Error whilst writing state file {0}, {1}", statepath, ex.Message);
1944 }
1945
1946 XmlNodeList mapL = rootE.GetElementsByTagName("LineMap");
1947 if (mapL.Count > 0)
1948 {
1949 XmlElement mapE = (XmlElement)mapL[0];
1950
1951 string mappath = Path.Combine(m_ScriptEnginesPath, World.RegionInfo.RegionID.ToString());
1952 mappath = Path.Combine(mappath, mapE.GetAttribute("Filename"));
1953
1954 try
1955 {
1956 using (FileStream mfs = File.Create(mappath))
1957 {
1958 using (StreamWriter msw = new StreamWriter(mfs))
1959 {
1960 msw.Write(mapE.InnerText);
1961 msw.Close();
1962 }
1963 mfs.Close();
1964 }
1965 }
1966 catch (IOException ex)
1967 {
1968 // if there already exists a file at that location, it may be locked.
1969 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message);
1970 }
1971 } 2078 }
1972 2079
1973 return true; 2080 return true;
@@ -2001,45 +2108,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine
2001 if (!topScripts.ContainsKey(si.LocalID)) 2108 if (!topScripts.ContainsKey(si.LocalID))
2002 topScripts[si.RootLocalID] = 0; 2109 topScripts[si.RootLocalID] = 0;
2003 2110
2004// long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; 2111 topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow);
2005// float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); 2112 }
2006 2113 }
2007 // Execution time of the script adjusted by it's measurement period to make scripts started at
2008 // different times comparable.
2009// float adjustedExecutionTime
2010// = (float)si.MeasurementPeriodExecutionTime
2011// / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod)
2012// / TimeSpan.TicksPerMillisecond;
2013
2014 long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
2015
2016 // Avoid divide by zerp
2017 if (ticksElapsed == 0)
2018 ticksElapsed = 1;
2019 2114
2020 // Scale execution time to the ideal 55 fps frame time for these reasons. 2115 return topScripts;
2021 // 2116 }
2022 // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no
2023 // 'script execution time per frame', which is the original purpose of this value.
2024 //
2025 // 2) Giving the raw execution times is misleading since scripts start at different times, making
2026 // it impossible to compare scripts.
2027 //
2028 // 3) Scaling the raw execution time to the time that the script has been running is better but
2029 // is still misleading since a script that has just been rezzed may appear to have been running
2030 // for much longer.
2031 //
2032 // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect
2033 // since the figure does not represent actual execution time and very hard running scripts will
2034 // never exceed 18ms (though this is a very high number for script execution so is a warning sign).
2035 float adjustedExecutionTime
2036 = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f;
2037 2117
2038 topScripts[si.RootLocalID] += adjustedExecutionTime; 2118 public float GetScriptExecutionTime(List<UUID> itemIDs)
2119 {
2120 if (itemIDs == null|| itemIDs.Count == 0)
2121 {
2122 return 0.0f;
2123 }
2124 float time = 0.0f;
2125 long tickNow = Util.EnvironmentTickCount();
2126 IScriptInstance si;
2127 // Calculate the time for all scripts that this engine is executing
2128 // Ignore any others
2129 foreach (UUID id in itemIDs)
2130 {
2131 si = GetInstance(id);
2132 if (si != null && si.Running)
2133 {
2134 time += CalculateAdjustedExectionTime(si, tickNow);
2039 } 2135 }
2040 } 2136 }
2137 return time;
2138 }
2041 2139
2042 return topScripts; 2140 private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow)
2141 {
2142 long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
2143
2144 // Avoid divide by zero
2145 if (ticksElapsed == 0)
2146 ticksElapsed = 1;
2147
2148 // Scale execution time to the ideal 55 fps frame time for these reasons.
2149 //
2150 // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no
2151 // 'script execution time per frame', which is the original purpose of this value.
2152 //
2153 // 2) Giving the raw execution times is misleading since scripts start at different times, making
2154 // it impossible to compare scripts.
2155 //
2156 // 3) Scaling the raw execution time to the time that the script has been running is better but
2157 // is still misleading since a script that has just been rezzed may appear to have been running
2158 // for much longer.
2159 //
2160 // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect
2161 // since the figure does not represent actual execution time and very hard running scripts will
2162 // never exceed 18ms (though this is a very high number for script execution so is a warning sign).
2163 return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f;
2043 } 2164 }
2044 2165
2045 public void SuspendScript(UUID itemID) 2166 public void SuspendScript(UUID itemID)