aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptApi.cs19
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs41
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs860
-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.cs292
-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.cs20
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs25
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs39
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs9
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs139
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs7
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs10
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs100
21 files changed, 917 insertions, 732 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/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/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 ea78dc3..2700495 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,11 +111,12 @@ 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;
113 118
114 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 119 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
115 { 120 {
116 m_ShoutSayTimer = new Timer(1000); 121 m_ShoutSayTimer = new Timer(1000);
117 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed; 122 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed;
@@ -120,10 +125,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
120 125
121 m_ScriptEngine = ScriptEngine; 126 m_ScriptEngine = ScriptEngine;
122 m_host = host; 127 m_host = host;
123 m_localID = localID; 128 m_item = item;
124 m_itemID = itemID;
125 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 129 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
126 130
131 LoadLimits(); // read script limits from config.
132
133 m_TransferModule =
134 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>();
135 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
136
137 AsyncCommands = new AsyncCommandManager(ScriptEngine);
138 }
139
140 /* load configuration items that affect script, object and run-time behavior. */
141 private void LoadLimits()
142 {
127 m_ScriptDelayFactor = 143 m_ScriptDelayFactor =
128 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); 144 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f);
129 m_ScriptDistanceFactor = 145 m_ScriptDistanceFactor =
@@ -136,12 +152,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
136 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); 152 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255);
137 if (m_notecardLineReadCharsMax > 65535) 153 if (m_notecardLineReadCharsMax > 65535)
138 m_notecardLineReadCharsMax = 65535; 154 m_notecardLineReadCharsMax = 65535;
139 155 // load limits for particular subsystems.
140 m_TransferModule = 156 IConfig SMTPConfig;
141 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); 157 if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) {
142 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); 158 // there's an smtp config, so load in the snooze time.
143 159 EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME);
144 AsyncCommands = new AsyncCommandManager(ScriptEngine); 160 }
145 } 161 }
146 162
147 public override Object InitializeLifetimeService() 163 public override Object InitializeLifetimeService()
@@ -173,7 +189,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
173 [DebuggerNonUserCode] 189 [DebuggerNonUserCode]
174 public void state(string newState) 190 public void state(string newState)
175 { 191 {
176 m_ScriptEngine.SetState(m_itemID, newState); 192 m_ScriptEngine.SetState(m_item.ItemID, newState);
177 } 193 }
178 194
179 /// <summary> 195 /// <summary>
@@ -184,7 +200,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
184 public void llResetScript() 200 public void llResetScript()
185 { 201 {
186 m_host.AddScriptLPS(1); 202 m_host.AddScriptLPS(1);
187 m_ScriptEngine.ApiResetScript(m_itemID); 203 m_ScriptEngine.ApiResetScript(m_item.ItemID);
188 } 204 }
189 205
190 public void llResetOtherScript(string name) 206 public void llResetOtherScript(string name)
@@ -336,77 +352,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
336 } 352 }
337 } 353 }
338 354
339 protected UUID InventorySelf()
340 {
341 UUID invItemID = new UUID();
342 bool unlock = false;
343 if (!m_host.TaskInventory.IsReadLockedByMe())
344 {
345 m_host.TaskInventory.LockItemsForRead(true);
346 unlock = true;
347 }
348 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
349 {
350 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
351 {
352 invItemID = inv.Key;
353 break;
354 }
355 }
356 if (unlock)
357 {
358 m_host.TaskInventory.LockItemsForRead(false);
359 }
360 return invItemID;
361 }
362
363 protected UUID InventoryKey(string name, int type) 355 protected UUID InventoryKey(string name, int type)
364 { 356 {
365 m_host.AddScriptLPS(1); 357 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
366 m_host.TaskInventory.LockItemsForRead(true);
367
368 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
369 {
370 if (inv.Value.Name == name)
371 {
372 m_host.TaskInventory.LockItemsForRead(false);
373
374 if (inv.Value.Type != type)
375 {
376 return UUID.Zero;
377 }
378
379 return inv.Value.AssetID;
380 }
381 }
382
383 m_host.TaskInventory.LockItemsForRead(false);
384 return UUID.Zero;
385 }
386
387 protected UUID InventoryKey(string name)
388 {
389 m_host.AddScriptLPS(1);
390 358
391 359 if (item != null && item.Type == type)
392 m_host.TaskInventory.LockItemsForRead(true); 360 return item.AssetID;
393 361 else
394 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 362 return UUID.Zero;
395 {
396 if (inv.Value.Name == name)
397 {
398 m_host.TaskInventory.LockItemsForRead(false);
399 return inv.Value.AssetID;
400 }
401 }
402
403 m_host.TaskInventory.LockItemsForRead(false);
404
405
406 return UUID.Zero;
407 } 363 }
408 364
409
410 /// <summary> 365 /// <summary>
411 /// accepts a valid UUID, -or- a name of an inventory item. 366 /// accepts a valid UUID, -or- a name of an inventory item.
412 /// Returns a valid UUID or UUID.Zero if key invalid and item not found 367 /// Returns a valid UUID or UUID.Zero if key invalid and item not found
@@ -416,19 +371,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
416 /// <returns></returns> 371 /// <returns></returns>
417 protected UUID KeyOrName(string k) 372 protected UUID KeyOrName(string k)
418 { 373 {
419 UUID key = UUID.Zero; 374 UUID key;
420 375
421 // if we can parse the string as a key, use it. 376 // if we can parse the string as a key, use it.
422 if (UUID.TryParse(k, out key))
423 {
424 return key;
425 }
426 // else try to locate the name in inventory of object. found returns key, 377 // else try to locate the name in inventory of object. found returns key,
427 // not found returns UUID.Zero which will translate to the default particle texture 378 // not found returns UUID.Zero
428 else 379 if (!UUID.TryParse(k, out key))
429 { 380 {
430 return InventoryKey(k); 381 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
382
383 if (item != null)
384 key = item.AssetID;
385 else
386 key = UUID.Zero;
431 } 387 }
388
389 return key;
432 } 390 }
433 391
434 // convert a LSL_Rotation to a Quaternion 392 // convert a LSL_Rotation to a Quaternion
@@ -941,20 +899,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
941 899
942 public void llRegionSayTo(string target, int channel, string msg) 900 public void llRegionSayTo(string target, int channel, string msg)
943 { 901 {
944 string error = String.Empty;
945
946 if (msg.Length > 1023) 902 if (msg.Length > 1023)
947 msg = msg.Substring(0, 1023); 903 msg = msg.Substring(0, 1023);
948 904
949 m_host.AddScriptLPS(1); 905 m_host.AddScriptLPS(1);
950 906
907 if (channel == ScriptBaseClass.DEBUG_CHANNEL)
908 {
909 return;
910 }
911
951 UUID TargetID; 912 UUID TargetID;
952 UUID.TryParse(target, out TargetID); 913 UUID.TryParse(target, out TargetID);
953 914
954 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 915 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
955 if (wComm != null) 916 if (wComm != null)
956 if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error)) 917 wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg);
957 LSLError(error);
958 } 918 }
959 919
960 public LSL_Integer llListen(int channelID, string name, string ID, string msg) 920 public LSL_Integer llListen(int channelID, string name, string ID, string msg)
@@ -964,7 +924,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
964 UUID.TryParse(ID, out keyID); 924 UUID.TryParse(ID, out keyID);
965 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 925 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
966 if (wComm != null) 926 if (wComm != null)
967 return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); 927 return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg);
968 else 928 else
969 return -1; 929 return -1;
970 } 930 }
@@ -974,7 +934,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
974 m_host.AddScriptLPS(1); 934 m_host.AddScriptLPS(1);
975 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 935 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
976 if (wComm != null) 936 if (wComm != null)
977 wComm.ListenControl(m_itemID, number, active); 937 wComm.ListenControl(m_item.ItemID, number, active);
978 } 938 }
979 939
980 public void llListenRemove(int number) 940 public void llListenRemove(int number)
@@ -982,7 +942,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
982 m_host.AddScriptLPS(1); 942 m_host.AddScriptLPS(1);
983 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 943 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
984 if (wComm != null) 944 if (wComm != null)
985 wComm.ListenRemove(m_itemID, number); 945 wComm.ListenRemove(m_item.ItemID, number);
986 } 946 }
987 947
988 public void llSensor(string name, string id, int type, double range, double arc) 948 public void llSensor(string name, string id, int type, double range, double arc)
@@ -991,7 +951,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
991 UUID keyID = UUID.Zero; 951 UUID keyID = UUID.Zero;
992 UUID.TryParse(id, out keyID); 952 UUID.TryParse(id, out keyID);
993 953
994 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); 954 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host);
995 } 955 }
996 956
997 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) 957 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate)
@@ -1000,13 +960,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1000 UUID keyID = UUID.Zero; 960 UUID keyID = UUID.Zero;
1001 UUID.TryParse(id, out keyID); 961 UUID.TryParse(id, out keyID);
1002 962
1003 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); 963 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host);
1004 } 964 }
1005 965
1006 public void llSensorRemove() 966 public void llSensorRemove()
1007 { 967 {
1008 m_host.AddScriptLPS(1); 968 m_host.AddScriptLPS(1);
1009 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); 969 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID);
1010 } 970 }
1011 971
1012 public string resolveName(UUID objecUUID) 972 public string resolveName(UUID objecUUID)
@@ -1047,7 +1007,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1047 public LSL_String llDetectedName(int number) 1007 public LSL_String llDetectedName(int number)
1048 { 1008 {
1049 m_host.AddScriptLPS(1); 1009 m_host.AddScriptLPS(1);
1050 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1010 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1051 if (detectedParams == null) 1011 if (detectedParams == null)
1052 return String.Empty; 1012 return String.Empty;
1053 return detectedParams.Name; 1013 return detectedParams.Name;
@@ -1056,7 +1016,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1056 public LSL_String llDetectedKey(int number) 1016 public LSL_String llDetectedKey(int number)
1057 { 1017 {
1058 m_host.AddScriptLPS(1); 1018 m_host.AddScriptLPS(1);
1059 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1019 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1060 if (detectedParams == null) 1020 if (detectedParams == null)
1061 return String.Empty; 1021 return String.Empty;
1062 return detectedParams.Key.ToString(); 1022 return detectedParams.Key.ToString();
@@ -1065,7 +1025,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1065 public LSL_String llDetectedOwner(int number) 1025 public LSL_String llDetectedOwner(int number)
1066 { 1026 {
1067 m_host.AddScriptLPS(1); 1027 m_host.AddScriptLPS(1);
1068 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1028 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1069 if (detectedParams == null) 1029 if (detectedParams == null)
1070 return String.Empty; 1030 return String.Empty;
1071 return detectedParams.Owner.ToString(); 1031 return detectedParams.Owner.ToString();
@@ -1074,7 +1034,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1074 public LSL_Integer llDetectedType(int number) 1034 public LSL_Integer llDetectedType(int number)
1075 { 1035 {
1076 m_host.AddScriptLPS(1); 1036 m_host.AddScriptLPS(1);
1077 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1037 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1078 if (detectedParams == null) 1038 if (detectedParams == null)
1079 return 0; 1039 return 0;
1080 return new LSL_Integer(detectedParams.Type); 1040 return new LSL_Integer(detectedParams.Type);
@@ -1083,7 +1043,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1083 public LSL_Vector llDetectedPos(int number) 1043 public LSL_Vector llDetectedPos(int number)
1084 { 1044 {
1085 m_host.AddScriptLPS(1); 1045 m_host.AddScriptLPS(1);
1086 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1046 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1087 if (detectedParams == null) 1047 if (detectedParams == null)
1088 return new LSL_Vector(); 1048 return new LSL_Vector();
1089 return detectedParams.Position; 1049 return detectedParams.Position;
@@ -1092,7 +1052,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1092 public LSL_Vector llDetectedVel(int number) 1052 public LSL_Vector llDetectedVel(int number)
1093 { 1053 {
1094 m_host.AddScriptLPS(1); 1054 m_host.AddScriptLPS(1);
1095 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1055 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1096 if (detectedParams == null) 1056 if (detectedParams == null)
1097 return new LSL_Vector(); 1057 return new LSL_Vector();
1098 return detectedParams.Velocity; 1058 return detectedParams.Velocity;
@@ -1101,7 +1061,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1101 public LSL_Vector llDetectedGrab(int number) 1061 public LSL_Vector llDetectedGrab(int number)
1102 { 1062 {
1103 m_host.AddScriptLPS(1); 1063 m_host.AddScriptLPS(1);
1104 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1064 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1105 if (parms == null) 1065 if (parms == null)
1106 return new LSL_Vector(0, 0, 0); 1066 return new LSL_Vector(0, 0, 0);
1107 1067
@@ -1111,7 +1071,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1111 public LSL_Rotation llDetectedRot(int number) 1071 public LSL_Rotation llDetectedRot(int number)
1112 { 1072 {
1113 m_host.AddScriptLPS(1); 1073 m_host.AddScriptLPS(1);
1114 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1074 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1115 if (detectedParams == null) 1075 if (detectedParams == null)
1116 return new LSL_Rotation(); 1076 return new LSL_Rotation();
1117 return detectedParams.Rotation; 1077 return detectedParams.Rotation;
@@ -1120,7 +1080,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1120 public LSL_Integer llDetectedGroup(int number) 1080 public LSL_Integer llDetectedGroup(int number)
1121 { 1081 {
1122 m_host.AddScriptLPS(1); 1082 m_host.AddScriptLPS(1);
1123 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1083 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1124 if (detectedParams == null) 1084 if (detectedParams == null)
1125 return new LSL_Integer(0); 1085 return new LSL_Integer(0);
1126 if (m_host.GroupID == detectedParams.Group) 1086 if (m_host.GroupID == detectedParams.Group)
@@ -1131,7 +1091,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1131 public LSL_Integer llDetectedLinkNumber(int number) 1091 public LSL_Integer llDetectedLinkNumber(int number)
1132 { 1092 {
1133 m_host.AddScriptLPS(1); 1093 m_host.AddScriptLPS(1);
1134 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1094 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1135 if (parms == null) 1095 if (parms == null)
1136 return new LSL_Integer(0); 1096 return new LSL_Integer(0);
1137 1097
@@ -1144,7 +1104,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1144 public LSL_Vector llDetectedTouchBinormal(int index) 1104 public LSL_Vector llDetectedTouchBinormal(int index)
1145 { 1105 {
1146 m_host.AddScriptLPS(1); 1106 m_host.AddScriptLPS(1);
1147 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1107 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1148 if (detectedParams == null) 1108 if (detectedParams == null)
1149 return new LSL_Vector(); 1109 return new LSL_Vector();
1150 return detectedParams.TouchBinormal; 1110 return detectedParams.TouchBinormal;
@@ -1156,7 +1116,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1156 public LSL_Integer llDetectedTouchFace(int index) 1116 public LSL_Integer llDetectedTouchFace(int index)
1157 { 1117 {
1158 m_host.AddScriptLPS(1); 1118 m_host.AddScriptLPS(1);
1159 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1119 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1160 if (detectedParams == null) 1120 if (detectedParams == null)
1161 return new LSL_Integer(-1); 1121 return new LSL_Integer(-1);
1162 return new LSL_Integer(detectedParams.TouchFace); 1122 return new LSL_Integer(detectedParams.TouchFace);
@@ -1168,7 +1128,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1168 public LSL_Vector llDetectedTouchNormal(int index) 1128 public LSL_Vector llDetectedTouchNormal(int index)
1169 { 1129 {
1170 m_host.AddScriptLPS(1); 1130 m_host.AddScriptLPS(1);
1171 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1131 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1172 if (detectedParams == null) 1132 if (detectedParams == null)
1173 return new LSL_Vector(); 1133 return new LSL_Vector();
1174 return detectedParams.TouchNormal; 1134 return detectedParams.TouchNormal;
@@ -1180,7 +1140,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1180 public LSL_Vector llDetectedTouchPos(int index) 1140 public LSL_Vector llDetectedTouchPos(int index)
1181 { 1141 {
1182 m_host.AddScriptLPS(1); 1142 m_host.AddScriptLPS(1);
1183 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1143 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1184 if (detectedParams == null) 1144 if (detectedParams == null)
1185 return new LSL_Vector(); 1145 return new LSL_Vector();
1186 return detectedParams.TouchPos; 1146 return detectedParams.TouchPos;
@@ -1192,7 +1152,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1192 public LSL_Vector llDetectedTouchST(int index) 1152 public LSL_Vector llDetectedTouchST(int index)
1193 { 1153 {
1194 m_host.AddScriptLPS(1); 1154 m_host.AddScriptLPS(1);
1195 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1155 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1196 if (detectedParams == null) 1156 if (detectedParams == null)
1197 return new LSL_Vector(-1.0, -1.0, 0.0); 1157 return new LSL_Vector(-1.0, -1.0, 0.0);
1198 return detectedParams.TouchST; 1158 return detectedParams.TouchST;
@@ -1204,7 +1164,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1204 public LSL_Vector llDetectedTouchUV(int index) 1164 public LSL_Vector llDetectedTouchUV(int index)
1205 { 1165 {
1206 m_host.AddScriptLPS(1); 1166 m_host.AddScriptLPS(1);
1207 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1167 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1208 if (detectedParams == null) 1168 if (detectedParams == null)
1209 return new LSL_Vector(-1.0, -1.0, 0.0); 1169 return new LSL_Vector(-1.0, -1.0, 0.0);
1210 return detectedParams.TouchUV; 1170 return detectedParams.TouchUV;
@@ -1907,12 +1867,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1907 1867
1908 return rgb; 1868 return rgb;
1909 } 1869 }
1870
1910 if (face >= 0 && face < GetNumberOfSides(part)) 1871 if (face >= 0 && face < GetNumberOfSides(part))
1911 { 1872 {
1912 texcolor = tex.GetFace((uint)face).RGBA; 1873 texcolor = tex.GetFace((uint)face).RGBA;
1913 rgb.x = texcolor.R; 1874 rgb.x = texcolor.R;
1914 rgb.y = texcolor.G; 1875 rgb.y = texcolor.G;
1915 rgb.z = texcolor.B; 1876 rgb.z = texcolor.B;
1877
1916 return rgb; 1878 return rgb;
1917 } 1879 }
1918 else 1880 else
@@ -2952,20 +2914,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2952 2914
2953 public LSL_Integer llGiveMoney(string destination, int amount) 2915 public LSL_Integer llGiveMoney(string destination, int amount)
2954 { 2916 {
2955 UUID invItemID=InventorySelf();
2956 if (invItemID == UUID.Zero)
2957 return 0;
2958
2959 m_host.AddScriptLPS(1); 2917 m_host.AddScriptLPS(1);
2960 2918
2961 m_host.TaskInventory.LockItemsForRead(true); 2919 if (m_item.PermsGranter == UUID.Zero)
2962 TaskInventoryItem item = m_host.TaskInventory[invItemID];
2963 m_host.TaskInventory.LockItemsForRead(false);
2964
2965 if (item.PermsGranter == UUID.Zero)
2966 return 0; 2920 return 0;
2967 2921
2968 if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) 2922 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0)
2969 { 2923 {
2970 LSLError("No permissions to give money"); 2924 LSLError("No permissions to give money");
2971 return 0; 2925 return 0;
@@ -3152,11 +3106,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3152 sec = m_MinTimerInterval; 3106 sec = m_MinTimerInterval;
3153 m_host.AddScriptLPS(1); 3107 m_host.AddScriptLPS(1);
3154 // Setting timer repeat 3108 // Setting timer repeat
3155 AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); 3109 AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec);
3156 } 3110 }
3157 3111
3158 public virtual void llSleep(double sec) 3112 public virtual void llSleep(double sec)
3159 { 3113 {
3114// m_log.Info("llSleep snoozing " + sec + "s.");
3160 m_host.AddScriptLPS(1); 3115 m_host.AddScriptLPS(1);
3161 Thread.Sleep((int)(sec * 1000)); 3116 Thread.Sleep((int)(sec * 1000));
3162 } 3117 }
@@ -3215,29 +3170,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3215 3170
3216 public void llTakeControls(int controls, int accept, int pass_on) 3171 public void llTakeControls(int controls, int accept, int pass_on)
3217 { 3172 {
3218 TaskInventoryItem item; 3173 if (m_item.PermsGranter != UUID.Zero)
3219
3220 m_host.TaskInventory.LockItemsForRead(true);
3221 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3222 { 3174 {
3223 m_host.TaskInventory.LockItemsForRead(false); 3175 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3224 return;
3225 }
3226 else
3227 {
3228 item = m_host.TaskInventory[InventorySelf()];
3229 }
3230 m_host.TaskInventory.LockItemsForRead(false);
3231
3232 if (item.PermsGranter != UUID.Zero)
3233 {
3234 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3235 3176
3236 if (presence != null) 3177 if (presence != null)
3237 { 3178 {
3238 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3179 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3239 { 3180 {
3240 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); 3181 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID);
3241 } 3182 }
3242 } 3183 }
3243 } 3184 }
@@ -3247,38 +3188,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3247 3188
3248 public void llReleaseControls() 3189 public void llReleaseControls()
3249 { 3190 {
3250 TaskInventoryItem item;
3251
3252 m_host.TaskInventory.LockItemsForRead(true);
3253 lock (m_host.TaskInventory)
3254 {
3255
3256 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3257 {
3258 m_host.TaskInventory.LockItemsForRead(false);
3259 return;
3260 }
3261 else
3262 {
3263 item = m_host.TaskInventory[InventorySelf()];
3264 }
3265 }
3266 m_host.TaskInventory.LockItemsForRead(false);
3267
3268 m_host.AddScriptLPS(1); 3191 m_host.AddScriptLPS(1);
3269 3192
3270 if (item.PermsGranter != UUID.Zero) 3193 if (m_item.PermsGranter != UUID.Zero)
3271 { 3194 {
3272 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3195 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3273 3196
3274 if (presence != null) 3197 if (presence != null)
3275 { 3198 {
3276 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3199 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3277 { 3200 {
3278 // Unregister controls from Presence 3201 // Unregister controls from Presence
3279 presence.UnRegisterControlEventsToScript(m_localID, m_itemID); 3202 presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
3280 // Remove Take Control permission. 3203 // Remove Take Control permission.
3281 item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; 3204 m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
3282 } 3205 }
3283 } 3206 }
3284 } 3207 }
@@ -3291,86 +3214,71 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3291 m_UrlModule.ReleaseURL(url); 3214 m_UrlModule.ReleaseURL(url);
3292 } 3215 }
3293 3216
3294 public void llAttachToAvatar(int attachment) 3217 /// <summary>
3218 /// Attach the object containing this script to the avatar that owns it.
3219 /// </summary>
3220 /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param>
3221 /// <returns>true if the attach suceeded, false if it did not</returns>
3222 public bool AttachToAvatar(int attachmentPoint)
3295 { 3223 {
3296 m_host.AddScriptLPS(1); 3224 SceneObjectGroup grp = m_host.ParentGroup;
3225 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
3297 3226
3298 TaskInventoryItem item; 3227 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3299
3300 m_host.TaskInventory.LockItemsForRead(true);
3301 3228
3302 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3229 if (attachmentsModule != null)
3303 { 3230 return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false);
3304 m_host.TaskInventory.LockItemsForRead(false);
3305 return;
3306 }
3307 else 3231 else
3308 { 3232 return false;
3309 item = m_host.TaskInventory[InventorySelf()]; 3233 }
3310 }
3311
3312 m_host.TaskInventory.LockItemsForRead(false);
3313 3234
3314 if (item.PermsGranter != m_host.OwnerID) 3235 /// <summary>
3315 return; 3236 /// Detach the object containing this script from the avatar it is attached to.
3237 /// </summary>
3238 /// <remarks>
3239 /// Nothing happens if the object is not attached.
3240 /// </remarks>
3241 public void DetachFromAvatar()
3242 {
3243 Util.FireAndForget(DetachWrapper, m_host);
3244 }
3316 3245
3317 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3246 private void DetachWrapper(object o)
3318 { 3247 {
3319 SceneObjectGroup grp = m_host.ParentGroup; 3248 SceneObjectPart host = (SceneObjectPart)o;
3320 3249
3321 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 3250 SceneObjectGroup grp = host.ParentGroup;
3251 UUID itemID = grp.FromItemID;
3252 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3322 3253
3323 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; 3254 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3324 if (attachmentsModule != null) 3255 if (attachmentsModule != null)
3325 attachmentsModule.AttachObject(presence, grp, (uint)attachment, false); 3256 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3326 }
3327 } 3257 }
3328 3258
3329 public void llDetachFromAvatar() 3259 public void llAttachToAvatar(int attachmentPoint)
3330 { 3260 {
3331 m_host.AddScriptLPS(1); 3261 m_host.AddScriptLPS(1);
3332 3262
3333 if (m_host.ParentGroup.AttachmentPoint == 0) 3263 if (m_item.PermsGranter != m_host.OwnerID)
3334 return; 3264 return;
3335 3265
3336 TaskInventoryItem item; 3266 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3267 AttachToAvatar(attachmentPoint);
3268 }
3337 3269
3338 m_host.TaskInventory.LockItemsForRead(true); 3270 public void llDetachFromAvatar()
3271 {
3272 m_host.AddScriptLPS(1);
3339 3273
3340 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3274 if (m_host.ParentGroup.AttachmentPoint == 0)
3341 {
3342 m_host.TaskInventory.LockItemsForRead(false);
3343 return; 3275 return;
3344 }
3345 else
3346 {
3347 item = m_host.TaskInventory[InventorySelf()];
3348 }
3349 m_host.TaskInventory.LockItemsForRead(false);
3350
3351 3276
3352 if (item.PermsGranter != m_host.OwnerID) 3277 if (m_item.PermsGranter != m_host.OwnerID)
3353 return; 3278 return;
3354 3279
3355 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3280 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3356 { 3281 DetachFromAvatar();
3357 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3358 if (attachmentsModule != null)
3359 Util.FireAndForget(DetachWrapper, m_host);
3360 }
3361 }
3362
3363 private void DetachWrapper(object o)
3364 {
3365 SceneObjectPart host = (SceneObjectPart)o;
3366
3367 SceneObjectGroup grp = host.ParentGroup;
3368 UUID itemID = grp.FromItemID;
3369 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3370
3371 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3372 if (attachmentsModule != null)
3373 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3374 } 3282 }
3375 3283
3376 public void llTakeCamera(string avatar) 3284 public void llTakeCamera(string avatar)
@@ -3491,7 +3399,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3491 } 3399 }
3492 3400
3493 emailModule.SendEmail(m_host.UUID, address, subject, message); 3401 emailModule.SendEmail(m_host.UUID, address, subject, message);
3494 ScriptSleep(15000); 3402 ScriptSleep(EMAIL_PAUSE_TIME * 1000);
3495 } 3403 }
3496 3404
3497 public void llGetNextEmail(string address, string subject) 3405 public void llGetNextEmail(string address, string subject)
@@ -3528,6 +3436,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3528 return m_host.UUID.ToString(); 3436 return m_host.UUID.ToString();
3529 } 3437 }
3530 3438
3439 public LSL_Key llGenerateKey()
3440 {
3441 m_host.AddScriptLPS(1);
3442 return UUID.Random().ToString();
3443 }
3444
3531 public void llSetBuoyancy(double buoyancy) 3445 public void llSetBuoyancy(double buoyancy)
3532 { 3446 {
3533 m_host.AddScriptLPS(1); 3447 m_host.AddScriptLPS(1);
@@ -3574,7 +3488,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3574 m_host.AddScriptLPS(1); 3488 m_host.AddScriptLPS(1);
3575 try 3489 try
3576 { 3490 {
3577 m_ScriptEngine.SetMinEventDelay(m_itemID, delay); 3491 m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay);
3578 } 3492 }
3579 catch (NotImplementedException) 3493 catch (NotImplementedException)
3580 { 3494 {
@@ -3627,29 +3541,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3627 { 3541 {
3628 m_host.AddScriptLPS(1); 3542 m_host.AddScriptLPS(1);
3629 3543
3630 UUID invItemID = InventorySelf(); 3544 if (m_item.PermsGranter == UUID.Zero)
3631 if (invItemID == UUID.Zero)
3632 return;
3633
3634 TaskInventoryItem item;
3635
3636 m_host.TaskInventory.LockItemsForRead(true);
3637 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3638 {
3639 m_host.TaskInventory.LockItemsForRead(false);
3640 return;
3641 }
3642 else
3643 {
3644 item = m_host.TaskInventory[InventorySelf()];
3645 }
3646 m_host.TaskInventory.LockItemsForRead(false);
3647 if (item.PermsGranter == UUID.Zero)
3648 return; 3545 return;
3649 3546
3650 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) 3547 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3651 { 3548 {
3652 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3549 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3653 3550
3654 if (presence != null) 3551 if (presence != null)
3655 { 3552 {
@@ -3667,41 +3564,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3667 { 3564 {
3668 m_host.AddScriptLPS(1); 3565 m_host.AddScriptLPS(1);
3669 3566
3670 UUID invItemID=InventorySelf(); 3567 if (m_item.PermsGranter == UUID.Zero)
3671 if (invItemID == UUID.Zero)
3672 return; 3568 return;
3673 3569
3674 TaskInventoryItem item; 3570 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3675
3676 m_host.TaskInventory.LockItemsForRead(true);
3677 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3678 { 3571 {
3679 m_host.TaskInventory.LockItemsForRead(false); 3572 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3680 return;
3681 }
3682 else
3683 {
3684 item = m_host.TaskInventory[InventorySelf()];
3685 }
3686 m_host.TaskInventory.LockItemsForRead(false);
3687
3688
3689 if (item.PermsGranter == UUID.Zero)
3690 return;
3691
3692 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3693 {
3694 UUID animID = new UUID();
3695
3696 if (!UUID.TryParse(anim, out animID))
3697 {
3698 animID=InventoryKey(anim);
3699 }
3700
3701 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3702 3573
3703 if (presence != null) 3574 if (presence != null)
3704 { 3575 {
3576 UUID animID = KeyOrName(anim);
3577
3705 if (animID == UUID.Zero) 3578 if (animID == UUID.Zero)
3706 presence.Animator.RemoveAnimation(anim); 3579 presence.Animator.RemoveAnimation(anim);
3707 else 3580 else
@@ -3734,44 +3607,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3734 public LSL_Integer llGetStartParameter() 3607 public LSL_Integer llGetStartParameter()
3735 { 3608 {
3736 m_host.AddScriptLPS(1); 3609 m_host.AddScriptLPS(1);
3737 return m_ScriptEngine.GetStartParameter(m_itemID); 3610 return m_ScriptEngine.GetStartParameter(m_item.ItemID);
3738 } 3611 }
3739 3612
3740 public void llRequestPermissions(string agent, int perm) 3613 public void llRequestPermissions(string agent, int perm)
3741 { 3614 {
3742 UUID agentID = new UUID(); 3615 UUID agentID;
3743 3616
3744 if (!UUID.TryParse(agent, out agentID)) 3617 if (!UUID.TryParse(agent, out agentID))
3745 return; 3618 return;
3746 3619
3747 UUID invItemID = InventorySelf();
3748
3749 if (invItemID == UUID.Zero)
3750 return; // Not in a prim? How??
3751
3752 TaskInventoryItem item;
3753
3754
3755 m_host.TaskInventory.LockItemsForRead(true);
3756 if (!m_host.TaskInventory.ContainsKey(invItemID))
3757 {
3758 m_host.TaskInventory.LockItemsForRead(false);
3759 return;
3760 }
3761 else
3762 {
3763 item = m_host.TaskInventory[invItemID];
3764 }
3765 m_host.TaskInventory.LockItemsForRead(false);
3766
3767 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3620 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3768 { 3621 {
3769 llReleaseControls(); 3622 llReleaseControls();
3770 3623
3771 item.PermsGranter = UUID.Zero; 3624 m_item.PermsGranter = UUID.Zero;
3772 item.PermsMask = 0; 3625 m_item.PermsMask = 0;
3773 3626
3774 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3627 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3775 "run_time_permissions", new Object[] { 3628 "run_time_permissions", new Object[] {
3776 new LSL_Integer(0) }, 3629 new LSL_Integer(0) },
3777 new DetectParams[0])); 3630 new DetectParams[0]));
@@ -3779,7 +3632,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3779 return; 3632 return;
3780 } 3633 }
3781 3634
3782 if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3635 if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3783 llReleaseControls(); 3636 llReleaseControls();
3784 3637
3785 m_host.AddScriptLPS(1); 3638 m_host.AddScriptLPS(1);
@@ -3796,11 +3649,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3796 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3649 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3797 { 3650 {
3798 m_host.TaskInventory.LockItemsForWrite(true); 3651 m_host.TaskInventory.LockItemsForWrite(true);
3799 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3652 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3800 m_host.TaskInventory[invItemID].PermsMask = perm; 3653 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3801 m_host.TaskInventory.LockItemsForWrite(false); 3654 m_host.TaskInventory.LockItemsForWrite(false);
3802 3655
3803 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3656 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3804 "run_time_permissions", new Object[] { 3657 "run_time_permissions", new Object[] {
3805 new LSL_Integer(perm) }, 3658 new LSL_Integer(perm) },
3806 new DetectParams[0])); 3659 new DetectParams[0]));
@@ -3835,11 +3688,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3835 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3688 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3836 { 3689 {
3837 m_host.TaskInventory.LockItemsForWrite(true); 3690 m_host.TaskInventory.LockItemsForWrite(true);
3838 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3691 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3839 m_host.TaskInventory[invItemID].PermsMask = perm; 3692 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3840 m_host.TaskInventory.LockItemsForWrite(false); 3693 m_host.TaskInventory.LockItemsForWrite(false);
3841 3694
3842 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3695 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3843 "run_time_permissions", new Object[] { 3696 "run_time_permissions", new Object[] {
3844 new LSL_Integer(perm) }, 3697 new LSL_Integer(perm) },
3845 new DetectParams[0])); 3698 new DetectParams[0]));
@@ -3850,9 +3703,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3850 } 3703 }
3851 3704
3852 ScenePresence presence = World.GetScenePresence(agentID); 3705 ScenePresence presence = World.GetScenePresence(agentID);
3853
3854 if (presence != null) 3706 if (presence != null)
3855 { 3707 {
3708 // If permissions are being requested from an NPC and were not implicitly granted above then
3709 // auto grant all reuqested permissions if the script is owned by the NPC or the NPCs owner
3710 INPCModule npcModule = World.RequestModuleInterface<INPCModule>();
3711 if (npcModule != null && npcModule.IsNPC(agentID, World))
3712 {
3713 if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID)
3714 {
3715 lock (m_host.TaskInventory)
3716 {
3717 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3718 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3719 }
3720
3721 m_ScriptEngine.PostScriptEvent(
3722 m_item.ItemID,
3723 new EventParams(
3724 "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0]));
3725 }
3726
3727 // it is an NPC, exit even if the permissions werent granted above, they are not going to answer
3728 // the question!
3729 return;
3730 }
3731
3856 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); 3732 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID);
3857 if (ownerName == String.Empty) 3733 if (ownerName == String.Empty)
3858 ownerName = "(hippos)"; 3734 ownerName = "(hippos)";
@@ -3860,8 +3736,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3860 if (!m_waitingForScriptAnswer) 3736 if (!m_waitingForScriptAnswer)
3861 { 3737 {
3862 m_host.TaskInventory.LockItemsForWrite(true); 3738 m_host.TaskInventory.LockItemsForWrite(true);
3863 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3739 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3864 m_host.TaskInventory[invItemID].PermsMask = 0; 3740 m_host.TaskInventory[m_item.ItemID].PermsMask = 0;
3865 m_host.TaskInventory.LockItemsForWrite(false); 3741 m_host.TaskInventory.LockItemsForWrite(false);
3866 3742
3867 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3743 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
@@ -3869,16 +3745,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3869 } 3745 }
3870 3746
3871 presence.ControllingClient.SendScriptQuestion( 3747 presence.ControllingClient.SendScriptQuestion(
3872 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); 3748 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm);
3873 3749
3874 return; 3750 return;
3875 } 3751 }
3876 3752
3877 // Requested agent is not in range, refuse perms 3753 // Requested agent is not in range, refuse perms
3878 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3754 m_ScriptEngine.PostScriptEvent(
3879 "run_time_permissions", new Object[] { 3755 m_item.ItemID,
3880 new LSL_Integer(0) }, 3756 new EventParams("run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0]));
3881 new DetectParams[0]));
3882 } 3757 }
3883 3758
3884 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) 3759 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer)
@@ -3886,24 +3761,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3886 if (taskID != m_host.UUID) 3761 if (taskID != m_host.UUID)
3887 return; 3762 return;
3888 3763
3889 UUID invItemID = InventorySelf(); 3764 client.OnScriptAnswer -= handleScriptAnswer;
3890 3765 m_waitingForScriptAnswer = false;
3891 if (invItemID == UUID.Zero)
3892 return;
3893
3894 client.OnScriptAnswer-=handleScriptAnswer;
3895 m_waitingForScriptAnswer=false;
3896 3766
3897 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3767 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3898 llReleaseControls(); 3768 llReleaseControls();
3899 3769
3900
3901 m_host.TaskInventory.LockItemsForWrite(true); 3770 m_host.TaskInventory.LockItemsForWrite(true);
3902 m_host.TaskInventory[invItemID].PermsMask = answer; 3771 m_host.TaskInventory[m_item.ItemID].PermsMask = answer;
3903 m_host.TaskInventory.LockItemsForWrite(false); 3772 m_host.TaskInventory.LockItemsForWrite(false);
3904 3773
3905 3774 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3906 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3907 "run_time_permissions", new Object[] { 3775 "run_time_permissions", new Object[] {
3908 new LSL_Integer(answer) }, 3776 new LSL_Integer(answer) },
3909 new DetectParams[0])); 3777 new DetectParams[0]));
@@ -3913,41 +3781,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3913 { 3781 {
3914 m_host.AddScriptLPS(1); 3782 m_host.AddScriptLPS(1);
3915 3783
3916 m_host.TaskInventory.LockItemsForRead(true); 3784 return m_item.PermsGranter.ToString();
3917
3918 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3919 {
3920 if (item.Type == 10 && item.ItemID == m_itemID)
3921 {
3922 m_host.TaskInventory.LockItemsForRead(false);
3923 return item.PermsGranter.ToString();
3924 }
3925 }
3926 m_host.TaskInventory.LockItemsForRead(false);
3927
3928 return UUID.Zero.ToString();
3929 } 3785 }
3930 3786
3931 public LSL_Integer llGetPermissions() 3787 public LSL_Integer llGetPermissions()
3932 { 3788 {
3933 m_host.AddScriptLPS(1); 3789 m_host.AddScriptLPS(1);
3934 3790
3935 m_host.TaskInventory.LockItemsForRead(true); 3791 int perms = m_item.PermsMask;
3936 3792
3937 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3793 if (m_automaticLinkPermission)
3938 { 3794 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3939 if (item.Type == 10 && item.ItemID == m_itemID)
3940 {
3941 int perms = item.PermsMask;
3942 if (m_automaticLinkPermission)
3943 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3944 m_host.TaskInventory.LockItemsForRead(false);
3945 return perms;
3946 }
3947 }
3948 m_host.TaskInventory.LockItemsForRead(false);
3949 3795
3950 return 0; 3796 return perms;
3951 } 3797 }
3952 3798
3953 public LSL_Integer llGetLinkNumber() 3799 public LSL_Integer llGetLinkNumber()
@@ -3985,18 +3831,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3985 public void llCreateLink(string target, int parent) 3831 public void llCreateLink(string target, int parent)
3986 { 3832 {
3987 m_host.AddScriptLPS(1); 3833 m_host.AddScriptLPS(1);
3988 UUID invItemID = InventorySelf(); 3834
3989 UUID targetID; 3835 UUID targetID;
3990 3836
3991 if (!UUID.TryParse(target, out targetID)) 3837 if (!UUID.TryParse(target, out targetID))
3992 return; 3838 return;
3993 3839
3994 TaskInventoryItem item; 3840 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3995 m_host.TaskInventory.LockItemsForRead(true);
3996 item = m_host.TaskInventory[invItemID];
3997 m_host.TaskInventory.LockItemsForRead(false);
3998
3999 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4000 && !m_automaticLinkPermission) 3841 && !m_automaticLinkPermission)
4001 { 3842 {
4002 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3843 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
@@ -4004,7 +3845,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4004 } 3845 }
4005 3846
4006 IClientAPI client = null; 3847 IClientAPI client = null;
4007 ScenePresence sp = World.GetScenePresence(item.PermsGranter); 3848 ScenePresence sp = World.GetScenePresence(m_item.PermsGranter);
4008 if (sp != null) 3849 if (sp != null)
4009 client = sp.ControllingClient; 3850 client = sp.ControllingClient;
4010 3851
@@ -4050,18 +3891,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4050 public void llBreakLink(int linknum) 3891 public void llBreakLink(int linknum)
4051 { 3892 {
4052 m_host.AddScriptLPS(1); 3893 m_host.AddScriptLPS(1);
4053 UUID invItemID = InventorySelf();
4054 3894
4055 m_host.TaskInventory.LockItemsForRead(true); 3895 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4056 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3896 && !m_automaticLinkPermission)
4057 && !m_automaticLinkPermission) 3897 {
4058 { 3898 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
4059 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3899 return;
4060 m_host.TaskInventory.LockItemsForRead(false); 3900 }
4061 return; 3901
4062 }
4063 m_host.TaskInventory.LockItemsForRead(false);
4064
4065 if (linknum < ScriptBaseClass.LINK_THIS) 3902 if (linknum < ScriptBaseClass.LINK_THIS)
4066 return; 3903 return;
4067 3904
@@ -4160,12 +3997,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4160 { 3997 {
4161 m_host.AddScriptLPS(1); 3998 m_host.AddScriptLPS(1);
4162 3999
4163 UUID invItemID = InventorySelf(); 4000 TaskInventoryItem item = m_item;
4164
4165 TaskInventoryItem item;
4166 m_host.TaskInventory.LockItemsForRead(true);
4167 item = m_host.TaskInventory[invItemID];
4168 m_host.TaskInventory.LockItemsForRead(false);
4169 4001
4170 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 4002 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4171 && !m_automaticLinkPermission) 4003 && !m_automaticLinkPermission)
@@ -4476,7 +4308,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4476 { 4308 {
4477 if (item.Name == name) 4309 if (item.Name == name)
4478 { 4310 {
4479 if (item.ItemID == m_itemID) 4311 if (item.ItemID == m_item.ItemID)
4480 throw new ScriptDeleteException(); 4312 throw new ScriptDeleteException();
4481 else 4313 else
4482 m_host.Inventory.RemoveInventoryItem(item.ItemID); 4314 m_host.Inventory.RemoveInventoryItem(item.ItemID);
@@ -4610,8 +4442,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4610 UUID rq = UUID.Random(); 4442 UUID rq = UUID.Random();
4611 4443
4612 UUID tid = AsyncCommands. 4444 UUID tid = AsyncCommands.
4613 DataserverPlugin.RegisterRequest(m_localID, 4445 DataserverPlugin.RegisterRequest(m_host.LocalId,
4614 m_itemID, rq.ToString()); 4446 m_item.ItemID, rq.ToString());
4615 4447
4616 AsyncCommands. 4448 AsyncCommands.
4617 DataserverPlugin.DataserverReply(rq.ToString(), reply); 4449 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -4638,8 +4470,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4638 if (item.Type == 3 && item.Name == name) 4470 if (item.Type == 3 && item.Name == name)
4639 { 4471 {
4640 UUID tid = AsyncCommands. 4472 UUID tid = AsyncCommands.
4641 DataserverPlugin.RegisterRequest(m_localID, 4473 DataserverPlugin.RegisterRequest(m_host.LocalId,
4642 m_itemID, item.AssetID.ToString()); 4474 m_item.ItemID, item.AssetID.ToString());
4643 4475
4644 Vector3 region = new Vector3( 4476 Vector3 region = new Vector3(
4645 World.RegionInfo.RegionLocX * Constants.RegionSize, 4477 World.RegionInfo.RegionLocX * Constants.RegionSize,
@@ -5044,22 +4876,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5044 4876
5045 public LSL_String llGetScriptName() 4877 public LSL_String llGetScriptName()
5046 { 4878 {
5047 string result = String.Empty;
5048
5049 m_host.AddScriptLPS(1); 4879 m_host.AddScriptLPS(1);
5050 4880
5051 m_host.TaskInventory.LockItemsForRead(true); 4881 return m_item.Name != null ? m_item.Name : String.Empty;
5052 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
5053 {
5054 if (item.Type == 10 && item.ItemID == m_itemID)
5055 {
5056 result = item.Name!=null?item.Name:String.Empty;
5057 break;
5058 }
5059 }
5060 m_host.TaskInventory.LockItemsForRead(false);
5061
5062 return result;
5063 } 4882 }
5064 4883
5065 public LSL_Integer llGetLinkNumberOfSides(int link) 4884 public LSL_Integer llGetLinkNumberOfSides(int link)
@@ -6344,7 +6163,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6344 if (m_host.OwnerID == land.LandData.OwnerID) 6163 if (m_host.OwnerID == land.LandData.OwnerID)
6345 { 6164 {
6346 Vector3 pos = World.GetNearestAllowedPosition(presence, land); 6165 Vector3 pos = World.GetNearestAllowedPosition(presence, land);
6347 presence.TeleportWithMomentum(pos); 6166 presence.TeleportWithMomentum(pos, null);
6348 presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); 6167 presence.ControllingClient.SendAlertMessage("You have been ejected from this land");
6349 } 6168 }
6350 } 6169 }
@@ -7291,14 +7110,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7291 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7110 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7292 if (xmlrpcMod.IsEnabled()) 7111 if (xmlrpcMod.IsEnabled())
7293 { 7112 {
7294 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); 7113 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero);
7295 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); 7114 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>();
7296 if (xmlRpcRouter != null) 7115 if (xmlRpcRouter != null)
7297 { 7116 {
7298 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; 7117 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName;
7299 7118
7300 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, 7119 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID,
7301 m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, 7120 m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName,
7302 xmlrpcMod.Port.ToString())); 7121 xmlrpcMod.Port.ToString()));
7303 } 7122 }
7304 object[] resobj = new object[] 7123 object[] resobj = new object[]
@@ -7310,7 +7129,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7310 new LSL_Integer(0), 7129 new LSL_Integer(0),
7311 new LSL_String(String.Empty) 7130 new LSL_String(String.Empty)
7312 }; 7131 };
7313 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, 7132 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj,
7314 new DetectParams[0])); 7133 new DetectParams[0]));
7315 } 7134 }
7316 ScriptSleep(1000); 7135 ScriptSleep(1000);
@@ -7321,7 +7140,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7321 m_host.AddScriptLPS(1); 7140 m_host.AddScriptLPS(1);
7322 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7141 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7323 ScriptSleep(3000); 7142 ScriptSleep(3000);
7324 return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); 7143 return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString();
7325 } 7144 }
7326 7145
7327 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) 7146 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata)
@@ -8160,7 +7979,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8160 return; 7979 return;
8161 face = (int)rules.GetLSLIntegerItem(idx++); 7980 face = (int)rules.GetLSLIntegerItem(idx++);
8162 int shiny = (int)rules.GetLSLIntegerItem(idx++); 7981 int shiny = (int)rules.GetLSLIntegerItem(idx++);
8163 Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); 7982 Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++);
8164 7983
8165 SetShiny(part, face, shiny, bump); 7984 SetShiny(part, face, shiny, bump);
8166 7985
@@ -9625,7 +9444,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9625 public LSL_String llGetSimulatorHostname() 9444 public LSL_String llGetSimulatorHostname()
9626 { 9445 {
9627 m_host.AddScriptLPS(1); 9446 m_host.AddScriptLPS(1);
9628 return System.Environment.MachineName; 9447 IUrlModule UrlModule = World.RequestModuleInterface<IUrlModule>();
9448 return UrlModule.ExternalHostNameForLSL;
9629 } 9449 }
9630 9450
9631 // <summary> 9451 // <summary>
@@ -9964,13 +9784,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9964 { 9784 {
9965 m_host.AddScriptLPS(1); 9785 m_host.AddScriptLPS(1);
9966 if (m_UrlModule != null) 9786 if (m_UrlModule != null)
9967 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 9787 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
9968 return UUID.Zero.ToString(); 9788 return UUID.Zero.ToString();
9969 } 9789 }
9970 9790
9971 public LSL_String llRequestSimulatorData(string simulator, int data) 9791 public LSL_String llRequestSimulatorData(string simulator, int data)
9972 { 9792 {
9973 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); 9793 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL");
9974 9794
9975 try 9795 try
9976 { 9796 {
@@ -9980,7 +9800,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9980 9800
9981 GridRegion info; 9801 GridRegion info;
9982 9802
9983 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) 9803 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) //Det data for this simulator?
9804
9984 info = new GridRegion(m_ScriptEngine.World.RegionInfo); 9805 info = new GridRegion(m_ScriptEngine.World.RegionInfo);
9985 else 9806 else
9986 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); 9807 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator);
@@ -9993,10 +9814,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9993 ScriptSleep(1000); 9814 ScriptSleep(1000);
9994 return UUID.Zero.ToString(); 9815 return UUID.Zero.ToString();
9995 } 9816 }
9996 reply = new LSL_Vector( 9817 if (m_ScriptEngine.World.RegionInfo.RegionName != simulator)
9997 info.RegionLocX, 9818 {
9998 info.RegionLocY, 9819 //Hypergrid Region co-ordinates
9999 0).ToString(); 9820 uint rx = 0, ry = 0;
9821 Utils.LongToUInts(Convert.ToUInt64(info.RegionSecret), out rx, out ry);
9822
9823 reply = new LSL_Vector(
9824 rx,
9825 ry,
9826 0).ToString();
9827 }
9828 else
9829 {
9830 //Local-cooridnates
9831 reply = new LSL_Vector(
9832 info.RegionLocX,
9833 info.RegionLocY,
9834 0).ToString();
9835 }
10000 break; 9836 break;
10001 case ScriptBaseClass.DATA_SIM_STATUS: 9837 case ScriptBaseClass.DATA_SIM_STATUS:
10002 if (info != null) 9838 if (info != null)
@@ -10032,7 +9868,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10032 UUID rq = UUID.Random(); 9868 UUID rq = UUID.Random();
10033 9869
10034 UUID tid = AsyncCommands. 9870 UUID tid = AsyncCommands.
10035 DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 9871 DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
10036 9872
10037 AsyncCommands. 9873 AsyncCommands.
10038 DataserverPlugin.DataserverReply(rq.ToString(), reply); 9874 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -10051,7 +9887,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10051 m_host.AddScriptLPS(1); 9887 m_host.AddScriptLPS(1);
10052 9888
10053 if (m_UrlModule != null) 9889 if (m_UrlModule != null)
10054 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 9890 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
10055 return UUID.Zero.ToString(); 9891 return UUID.Zero.ToString();
10056 } 9892 }
10057 9893
@@ -10087,7 +9923,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10087 // child agents have a mass of 1.0 9923 // child agents have a mass of 1.0
10088 return 1; 9924 return 1;
10089 else 9925 else
10090 return avatar.GetMass(); 9926 return (double)avatar.GetMass();
10091 } 9927 }
10092 catch (KeyNotFoundException) 9928 catch (KeyNotFoundException)
10093 { 9929 {
@@ -10530,32 +10366,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10530 public LSL_Vector llGetCameraPos() 10366 public LSL_Vector llGetCameraPos()
10531 { 10367 {
10532 m_host.AddScriptLPS(1); 10368 m_host.AddScriptLPS(1);
10533 UUID invItemID = InventorySelf();
10534
10535 if (invItemID == UUID.Zero)
10536 return new LSL_Vector();
10537
10538 m_host.TaskInventory.LockItemsForRead(true);
10539
10540 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter;
10541 10369
10542// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 10370 if (m_item.PermsGranter == UUID.Zero)
10543 if (agentID == UUID.Zero) 10371 return new LSL_Vector();
10544 {
10545 m_host.TaskInventory.LockItemsForRead(false);
10546 return new LSL_Vector();
10547 }
10548 10372
10549 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 10373 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10550 { 10374 {
10551 ShoutError("No permissions to track the camera"); 10375 ShoutError("No permissions to track the camera");
10552 m_host.TaskInventory.LockItemsForRead(false);
10553 return new LSL_Vector(); 10376 return new LSL_Vector();
10554 } 10377 }
10555 m_host.TaskInventory.LockItemsForRead(false); 10378 m_host.TaskInventory.LockItemsForRead(false);
10556 10379
10557// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10380// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
10558 ScenePresence presence = World.GetScenePresence(agentID); 10381 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
10559 if (presence != null) 10382 if (presence != null)
10560 { 10383 {
10561 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); 10384 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z);
@@ -10567,30 +10390,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10567 public LSL_Rotation llGetCameraRot() 10390 public LSL_Rotation llGetCameraRot()
10568 { 10391 {
10569 m_host.AddScriptLPS(1); 10392 m_host.AddScriptLPS(1);
10570 UUID invItemID = InventorySelf();
10571 if (invItemID == UUID.Zero)
10572 return new LSL_Rotation();
10573
10574 m_host.TaskInventory.LockItemsForRead(true);
10575 10393
10576 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter; 10394 if (m_item.PermsGranter == UUID.Zero)
10395 return new LSL_Rotation();
10577 10396
10578// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 10397 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10579 if (agentID == UUID.Zero)
10580 {
10581 m_host.TaskInventory.LockItemsForRead(false);
10582 return new LSL_Rotation();
10583 }
10584 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10585 { 10398 {
10586 ShoutError("No permissions to track the camera"); 10399 ShoutError("No permissions to track the camera");
10587 m_host.TaskInventory.LockItemsForRead(false);
10588 return new LSL_Rotation(); 10400 return new LSL_Rotation();
10589 } 10401 }
10590 m_host.TaskInventory.LockItemsForRead(false); 10402 m_host.TaskInventory.LockItemsForRead(false);
10591 10403
10592// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10404// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
10593 ScenePresence presence = World.GetScenePresence(agentID); 10405 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
10594 if (presence != null) 10406 if (presence != null)
10595 { 10407 {
10596 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); 10408 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W);
@@ -10649,7 +10461,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10649 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) 10461 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt)
10650 { 10462 {
10651 m_host.AddScriptLPS(1); 10463 m_host.AddScriptLPS(1);
10652 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); 10464 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0);
10653 if (detectedParams == null) 10465 if (detectedParams == null)
10654 { 10466 {
10655 if (m_host.ParentGroup.IsAttachment == true) 10467 if (m_host.ParentGroup.IsAttachment == true)
@@ -10773,30 +10585,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10773 { 10585 {
10774 m_host.AddScriptLPS(1); 10586 m_host.AddScriptLPS(1);
10775 10587
10776 // our key in the object we are in
10777 UUID invItemID = InventorySelf();
10778 if (invItemID == UUID.Zero) return;
10779
10780 // the object we are in 10588 // the object we are in
10781 UUID objectID = m_host.ParentUUID; 10589 UUID objectID = m_host.ParentUUID;
10782 if (objectID == UUID.Zero) return; 10590 if (objectID == UUID.Zero)
10591 return;
10783 10592
10784 UUID agentID;
10785 m_host.TaskInventory.LockItemsForRead(true);
10786 // we need the permission first, to know which avatar we want to set the camera for 10593 // we need the permission first, to know which avatar we want to set the camera for
10787 agentID = m_host.TaskInventory[invItemID].PermsGranter; 10594 UUID agentID = m_item.PermsGranter;
10788 10595
10789 if (agentID == UUID.Zero) 10596 if (agentID == UUID.Zero)
10790 {
10791 m_host.TaskInventory.LockItemsForRead(false);
10792 return; 10597 return;
10793 } 10598
10794 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 10599 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
10795 {
10796 m_host.TaskInventory.LockItemsForRead(false);
10797 return; 10600 return;
10798 }
10799 m_host.TaskInventory.LockItemsForRead(false);
10800 10601
10801 ScenePresence presence = World.GetScenePresence(agentID); 10602 ScenePresence presence = World.GetScenePresence(agentID);
10802 10603
@@ -10838,34 +10639,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10838 { 10639 {
10839 m_host.AddScriptLPS(1); 10640 m_host.AddScriptLPS(1);
10840 10641
10841 // our key in the object we are in
10842 UUID invItemID=InventorySelf();
10843 if (invItemID == UUID.Zero) return;
10844
10845 // the object we are in 10642 // the object we are in
10846 UUID objectID = m_host.ParentUUID; 10643 UUID objectID = m_host.ParentUUID;
10847 if (objectID == UUID.Zero) return; 10644 if (objectID == UUID.Zero)
10645 return;
10848 10646
10849 // we need the permission first, to know which avatar we want to clear the camera for 10647 // we need the permission first, to know which avatar we want to clear the camera for
10850 UUID agentID; 10648 UUID agentID = m_item.PermsGranter;
10851 m_host.TaskInventory.LockItemsForRead(true); 10649
10852 agentID = m_host.TaskInventory[invItemID].PermsGranter;
10853 if (agentID == UUID.Zero) 10650 if (agentID == UUID.Zero)
10854 {
10855 m_host.TaskInventory.LockItemsForRead(false);
10856 return; 10651 return;
10857 } 10652
10858 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 10653 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
10859 {
10860 m_host.TaskInventory.LockItemsForRead(false);
10861 return; 10654 return;
10862 }
10863 m_host.TaskInventory.LockItemsForRead(false);
10864 10655
10865 ScenePresence presence = World.GetScenePresence(agentID); 10656 ScenePresence presence = World.GetScenePresence(agentID);
10866 10657
10867 // we are not interested in child-agents 10658 // we are not interested in child-agents
10868 if (presence.IsChildAgent) return; 10659 if (presence.IsChildAgent)
10660 return;
10869 10661
10870 presence.ControllingClient.SendClearFollowCamProperties(objectID); 10662 presence.ControllingClient.SendClearFollowCamProperties(objectID);
10871 } 10663 }
@@ -11056,8 +10848,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11056 } 10848 }
11057 } 10849 }
11058 10850
11059 UUID reqID = httpScriptMod. 10851 UUID reqID
11060 StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); 10852 = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body);
11061 10853
11062 if (reqID != UUID.Zero) 10854 if (reqID != UUID.Zero)
11063 return reqID.ToString(); 10855 return reqID.ToString();
@@ -11289,19 +11081,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11289 break; 11081 break;
11290 // For the following 8 see the Object version below 11082 // For the following 8 see the Object version below
11291 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11083 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11292 ret.Add(new LSL_Integer(0)); 11084 ret.Add(new LSL_Integer(av.RunningScriptCount()));
11293 break; 11085 break;
11294 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11086 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11295 ret.Add(new LSL_Integer(0)); 11087 ret.Add(new LSL_Integer(av.ScriptCount()));
11296 break; 11088 break;
11297 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11089 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11298 ret.Add(new LSL_Integer(0)); 11090 ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384));
11299 break; 11091 break;
11300 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11092 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11301 ret.Add(new LSL_Float(0)); 11093 ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f));
11302 break; 11094 break;
11303 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11095 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11304 ret.Add(new LSL_Integer(0)); 11096 ret.Add(new LSL_Integer(1));
11305 break; 11097 break;
11306 case ScriptBaseClass.OBJECT_SERVER_COST: 11098 case ScriptBaseClass.OBJECT_SERVER_COST:
11307 ret.Add(new LSL_Float(0)); 11099 ret.Add(new LSL_Float(0));
@@ -11353,43 +11145,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11353 case ScriptBaseClass.OBJECT_CREATOR: 11145 case ScriptBaseClass.OBJECT_CREATOR:
11354 ret.Add(new LSL_String(obj.CreatorID.ToString())); 11146 ret.Add(new LSL_String(obj.CreatorID.ToString()));
11355 break; 11147 break;
11356 // The following 8 I have intentionaly coded to return zero. They are part of
11357 // "Land Impact" calculations. These calculations are probably not applicable
11358 // to OpenSim, required figures (cpu/memory usage) are not currently tracked
11359 // I have intentionally left these all at zero rather than return possibly
11360 // missleading numbers
11361 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11148 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11362 // in SL this currently includes crashed scripts 11149 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount()));
11363 ret.Add(new LSL_Integer(0));
11364 break; 11150 break;
11365 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11151 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11366 ret.Add(new LSL_Integer(0)); 11152 ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount()));
11367 break; 11153 break;
11368 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11154 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11369 // The value returned in SL for mono scripts is 65536 * number of active scripts 11155 // The value returned in SL for mono scripts is 65536 * number of active scripts
11370 ret.Add(new LSL_Integer(0)); 11156 // and 16384 * number of active scripts for LSO. since llGetFreememory
11157 // is coded to give the LSO value use it here
11158 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384));
11371 break; 11159 break;
11372 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11160 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11373 // Average cpu time per simulator frame expended on all scripts in the objetc 11161 // Average cpu time in seconds per simulator frame expended on all scripts in the object
11374 ret.Add(new LSL_Float(0)); 11162 ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f));
11375 break; 11163 break;
11376 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11164 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11377 // according to the SL wiki A prim or linkset will have prim 11165 // according to the SL wiki A prim or linkset will have prim
11378 // equivalent of the number of prims in a linkset if it does not 11166 // equivalent of the number of prims in a linkset if it does not
11379 // contain a mesh anywhere in the link set or is not a normal prim 11167 // contain a mesh anywhere in the link set or is not a normal prim
11380 // The value returned in SL for normal prims is prim count 11168 // The value returned in SL for normal prims is prim count
11381 ret.Add(new LSL_Integer(0)); 11169 ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount));
11382 break; 11170 break;
11171 // The following 3 costs I have intentionaly coded to return zero. They are part of
11172 // "Land Impact" calculations. These calculations are probably not applicable
11173 // to OpenSim and are not yet complete in SL
11383 case ScriptBaseClass.OBJECT_SERVER_COST: 11174 case ScriptBaseClass.OBJECT_SERVER_COST:
11384 // The value returned in SL for normal prims is prim count 11175 // The linden calculation is here
11176 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight
11177 // The value returned in SL for normal prims looks like the prim count
11385 ret.Add(new LSL_Float(0)); 11178 ret.Add(new LSL_Float(0));
11386 break; 11179 break;
11387 case ScriptBaseClass.OBJECT_STREAMING_COST: 11180 case ScriptBaseClass.OBJECT_STREAMING_COST:
11388 // The value returned in SL for normal prims is prim count * 0.06 11181 // The linden calculation is here
11182 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Streaming_Cost
11183 // The value returned in SL for normal prims looks like the prim count * 0.06
11389 ret.Add(new LSL_Float(0)); 11184 ret.Add(new LSL_Float(0));
11390 break; 11185 break;
11391 case ScriptBaseClass.OBJECT_PHYSICS_COST: 11186 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11392 // The value returned in SL for normal prims is prim count 11187 // The linden calculation is here
11188 // http://wiki.secondlife.com/wiki/Mesh/Mesh_physics
11189 // The value returned in SL for normal prims looks like the prim count
11393 ret.Add(new LSL_Float(0)); 11190 ret.Add(new LSL_Float(0));
11394 break; 11191 break;
11395 default: 11192 default:
@@ -11487,7 +11284,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11487 } 11284 }
11488 11285
11489 // was: UUID tid = tid = AsyncCommands. 11286 // was: UUID tid = tid = AsyncCommands.
11490 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11287 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
11491 11288
11492 if (NotecardCache.IsCached(assetID)) 11289 if (NotecardCache.IsCached(assetID))
11493 { 11290 {
@@ -11550,7 +11347,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11550 } 11347 }
11551 11348
11552 // was: UUID tid = tid = AsyncCommands. 11349 // was: UUID tid = tid = AsyncCommands.
11553 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11350 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
11554 11351
11555 if (NotecardCache.IsCached(assetID)) 11352 if (NotecardCache.IsCached(assetID))
11556 { 11353 {
@@ -11634,7 +11431,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11634 { 11431 {
11635 UUID rq = UUID.Random(); 11432 UUID rq = UUID.Random();
11636 11433
11637 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 11434 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
11638 11435
11639 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); 11436 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id)));
11640 11437
@@ -11650,7 +11447,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11650 { 11447 {
11651 UUID rq = UUID.Random(); 11448 UUID rq = UUID.Random();
11652 11449
11653 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 11450 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
11654 11451
11655 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); 11452 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id));
11656 11453
@@ -12144,7 +11941,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12144 bool isAccount = false; 11941 bool isAccount = false;
12145 bool isGroup = false; 11942 bool isGroup = false;
12146 11943
12147 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) 11944 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID))
12148 return 0; 11945 return 0;
12149 11946
12150 UUID id = new UUID(); 11947 UUID id = new UUID();
@@ -12206,35 +12003,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12206 return 1; 12003 return 1;
12207 } 12004 }
12208 12005
12209 #region Not Implemented 12006 public LSL_Integer llGetMemoryLimit()
12210 // 12007 {
12211 // Listing the unimplemented lsl functions here, please move 12008 m_host.AddScriptLPS(1);
12212 // them from this region as they are completed 12009 // The value returned for LSO scripts in SL
12213 // 12010 return 16384;
12011 }
12214 12012
12215 public void llGetEnv(LSL_String name) 12013 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
12216 { 12014 {
12217 m_host.AddScriptLPS(1); 12015 m_host.AddScriptLPS(1);
12218 NotImplemented("llGetEnv"); 12016 // Treat as an LSO script
12017 return ScriptBaseClass.FALSE;
12219 } 12018 }
12220 12019
12221 public void llGetSPMaxMemory() 12020 public LSL_Integer llGetSPMaxMemory()
12222 { 12021 {
12223 m_host.AddScriptLPS(1); 12022 m_host.AddScriptLPS(1);
12224 NotImplemented("llGetSPMaxMemory"); 12023 // The value returned for LSO scripts in SL
12024 return 16384;
12225 } 12025 }
12226 12026
12227 public virtual LSL_Integer llGetUsedMemory() 12027 public virtual LSL_Integer llGetUsedMemory()
12228 { 12028 {
12229 m_host.AddScriptLPS(1); 12029 m_host.AddScriptLPS(1);
12230 NotImplemented("llGetUsedMemory"); 12030 // The value returned for LSO scripts in SL
12231 return 0; 12031 return 16384;
12232 } 12032 }
12233 12033
12234 public void llScriptProfiler(LSL_Integer flags) 12034 public void llScriptProfiler(LSL_Integer flags)
12235 { 12035 {
12236 m_host.AddScriptLPS(1); 12036 m_host.AddScriptLPS(1);
12237 //NotImplemented("llScriptProfiler"); 12037 // This does nothing for LSO scripts in SL
12038 }
12039
12040 #region Not Implemented
12041 //
12042 // Listing the unimplemented lsl functions here, please move
12043 // them from this region as they are completed
12044 //
12045
12046 public void llGetEnv(LSL_String name)
12047 {
12048 m_host.AddScriptLPS(1);
12049 NotImplemented("llGetEnv");
12238 } 12050 }
12239 12051
12240 public void llSetSoundQueueing(int queue) 12052 public void llSetSoundQueueing(int queue)
@@ -12314,8 +12126,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12314 12126
12315 try 12127 try
12316 { 12128 {
12317 UUID invItemID=InventorySelf(); 12129 TaskInventoryItem item = m_item;
12318 if (invItemID == UUID.Zero) 12130 if (item == null)
12319 { 12131 {
12320 replydata = "SERVICE_ERROR"; 12132 replydata = "SERVICE_ERROR";
12321 return; 12133 return;
@@ -12323,10 +12135,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12323 12135
12324 m_host.AddScriptLPS(1); 12136 m_host.AddScriptLPS(1);
12325 12137
12326 m_host.TaskInventory.LockItemsForRead(true);
12327 TaskInventoryItem item = m_host.TaskInventory[invItemID];
12328 m_host.TaskInventory.LockItemsForRead(false);
12329
12330 if (item.PermsGranter == UUID.Zero) 12138 if (item.PermsGranter == UUID.Zero)
12331 { 12139 {
12332 replydata = "MISSING_PERMISSION_DEBIT"; 12140 replydata = "MISSING_PERMISSION_DEBIT";
@@ -12368,7 +12176,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12368 } 12176 }
12369 finally 12177 finally
12370 { 12178 {
12371 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 12179 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
12372 "transaction_result", new Object[] { 12180 "transaction_result", new Object[] {
12373 new LSL_String(txn.ToString()), 12181 new LSL_String(txn.ToString()),
12374 new LSL_Integer(replycode), 12182 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..8237b60 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -128,11 +128,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
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 130
131 public const string GridInfoServiceConfigSectionName = "GridInfoService";
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
@@ -957,21 +960,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
957 UUID avatarID = (UUID)avatar; 960 UUID avatarID = (UUID)avatar;
958 961
959 m_host.AddScriptLPS(1); 962 m_host.AddScriptLPS(1);
963
964 // FIXME: What we really want to do here is factor out the similar code in llStopAnimation() to a common
965 // method (though see that doesn't do the is animation check, which is probably a bug) and have both
966 // these functions call that common code. However, this does mean navigating the brain-dead requirement
967 // of calling InitLSL()
960 if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) 968 if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence)
961 { 969 {
962 ScenePresence target = (ScenePresence)World.Entities[avatarID]; 970 ScenePresence target = (ScenePresence)World.Entities[avatarID];
963 if (target != null) 971 if (target != null)
964 { 972 {
965 UUID animID = UUID.Zero; 973 UUID animID;
966 m_host.TaskInventory.LockItemsForRead(true); 974
967 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 975 if (!UUID.TryParse(animation, out animID))
968 { 976 {
969 if (inv.Value.Name == animation) 977 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(animation);
970 { 978 if (item != null && item.Type == (int)AssetType.Animation)
971 if (inv.Value.Type == (int)AssetType.Animation) 979 animID = item.AssetID;
972 animID = inv.Value.AssetID; 980 else
973 continue; 981 animID = UUID.Zero;
974 }
975 } 982 }
976 m_host.TaskInventory.LockItemsForRead(false); 983 m_host.TaskInventory.LockItemsForRead(false);
977 984
@@ -1178,7 +1185,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1178 CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); 1185 CheckThreatLevel(ThreatLevel.High, "osSetStateEvents");
1179 m_host.AddScriptLPS(1); 1186 m_host.AddScriptLPS(1);
1180 1187
1181 m_host.SetScriptEvents(m_itemID, events); 1188 m_host.SetScriptEvents(m_item.ItemID, events);
1182 } 1189 }
1183 1190
1184 public void osSetRegionWaterHeight(double height) 1191 public void osSetRegionWaterHeight(double height)
@@ -1186,12 +1193,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1186 CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); 1193 CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight");
1187 1194
1188 m_host.AddScriptLPS(1); 1195 m_host.AddScriptLPS(1);
1189 //Check to make sure that the script's owner is the estate manager/master 1196
1190 //World.Permissions.GenericEstatePermission( 1197 World.EventManager.TriggerRequestChangeWaterHeight((float)height);
1191 if (World.Permissions.IsGod(m_host.OwnerID))
1192 {
1193 World.EventManager.TriggerRequestChangeWaterHeight((float)height);
1194 }
1195 } 1198 }
1196 1199
1197 /// <summary> 1200 /// <summary>
@@ -1202,27 +1205,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> 1205 /// <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) 1206 public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour)
1204 { 1207 {
1205 CheckThreatLevel(ThreatLevel.Nuisance, "osSetRegionSunSettings"); 1208 CheckThreatLevel(ThreatLevel.High, "osSetRegionSunSettings");
1206 1209
1207 m_host.AddScriptLPS(1); 1210 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 1211
1215 while (sunHour < 0) 1212 while (sunHour > 24.0)
1216 sunHour += 24.0; 1213 sunHour -= 24.0;
1217 1214
1215 while (sunHour < 0)
1216 sunHour += 24.0;
1218 1217
1219 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; 1218 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun;
1220 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 1219 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30
1221 World.RegionInfo.RegionSettings.FixedSun = sunFixed; 1220 World.RegionInfo.RegionSettings.FixedSun = sunFixed;
1222 World.RegionInfo.RegionSettings.Save(); 1221 World.RegionInfo.RegionSettings.Save();
1223 1222
1224 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); 1223 World.EventManager.TriggerEstateToolsSunUpdate(
1225 } 1224 World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour);
1226 } 1225 }
1227 1226
1228 /// <summary> 1227 /// <summary>
@@ -1232,26 +1231,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> 1231 /// <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) 1232 public void osSetEstateSunSettings(bool sunFixed, double sunHour)
1234 { 1233 {
1235 CheckThreatLevel(ThreatLevel.Nuisance, "osSetEstateSunSettings"); 1234 CheckThreatLevel(ThreatLevel.High, "osSetEstateSunSettings");
1236 1235
1237 m_host.AddScriptLPS(1); 1236 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 1237
1245 while (sunHour < 0) 1238 while (sunHour > 24.0)
1246 sunHour += 24.0; 1239 sunHour -= 24.0;
1247 1240
1248 World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; 1241 while (sunHour < 0)
1249 World.RegionInfo.EstateSettings.SunPosition = sunHour; 1242 sunHour += 24.0;
1250 World.RegionInfo.EstateSettings.FixedSun = sunFixed;
1251 World.RegionInfo.EstateSettings.Save();
1252 1243
1253 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); 1244 World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed;
1254 } 1245 World.RegionInfo.EstateSettings.SunPosition = sunHour;
1246 World.RegionInfo.EstateSettings.FixedSun = sunFixed;
1247 World.RegionInfo.EstateSettings.Save();
1248
1249 World.EventManager.TriggerEstateToolsSunUpdate(
1250 World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour);
1255 } 1251 }
1256 1252
1257 /// <summary> 1253 /// <summary>
@@ -1627,7 +1623,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1627 1623
1628 public Object osParseJSONNew(string JSON) 1624 public Object osParseJSONNew(string JSON)
1629 { 1625 {
1630 CheckThreatLevel(ThreatLevel.None, "osParseJSON"); 1626 CheckThreatLevel(ThreatLevel.None, "osParseJSONNew");
1631 1627
1632 m_host.AddScriptLPS(1); 1628 m_host.AddScriptLPS(1);
1633 1629
@@ -2042,8 +2038,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2042 string nick = String.Empty; 2038 string nick = String.Empty;
2043 IConfigSource config = m_ScriptEngine.ConfigSource; 2039 IConfigSource config = m_ScriptEngine.ConfigSource;
2044 2040
2045 if (config.Configs["GridInfo"] != null) 2041 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2046 nick = config.Configs["GridInfo"].GetString("gridnick", nick); 2042 nick = config.Configs[GridInfoServiceConfigSectionName].GetString("gridnick", nick);
2047 2043
2048 if (String.IsNullOrEmpty(nick)) 2044 if (String.IsNullOrEmpty(nick))
2049 nick = GridUserInfo(InfoType.Nick); 2045 nick = GridUserInfo(InfoType.Nick);
@@ -2059,8 +2055,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2059 string name = String.Empty; 2055 string name = String.Empty;
2060 IConfigSource config = m_ScriptEngine.ConfigSource; 2056 IConfigSource config = m_ScriptEngine.ConfigSource;
2061 2057
2062 if (config.Configs["GridInfo"] != null) 2058 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2063 name = config.Configs["GridInfo"].GetString("gridname", name); 2059 name = config.Configs[GridInfoServiceConfigSectionName].GetString("gridname", name);
2064 2060
2065 if (String.IsNullOrEmpty(name)) 2061 if (String.IsNullOrEmpty(name))
2066 name = GridUserInfo(InfoType.Name); 2062 name = GridUserInfo(InfoType.Name);
@@ -2076,8 +2072,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2076 string loginURI = String.Empty; 2072 string loginURI = String.Empty;
2077 IConfigSource config = m_ScriptEngine.ConfigSource; 2073 IConfigSource config = m_ScriptEngine.ConfigSource;
2078 2074
2079 if (config.Configs["GridInfo"] != null) 2075 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2080 loginURI = config.Configs["GridInfo"].GetString("login", loginURI); 2076 loginURI = config.Configs[GridInfoServiceConfigSectionName].GetString("login", loginURI);
2081 2077
2082 if (String.IsNullOrEmpty(loginURI)) 2078 if (String.IsNullOrEmpty(loginURI))
2083 loginURI = GridUserInfo(InfoType.Login); 2079 loginURI = GridUserInfo(InfoType.Login);
@@ -2124,8 +2120,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2124 string retval = String.Empty; 2120 string retval = String.Empty;
2125 IConfigSource config = m_ScriptEngine.ConfigSource; 2121 IConfigSource config = m_ScriptEngine.ConfigSource;
2126 2122
2127 if (config.Configs["GridInfo"] != null) 2123 if (config.Configs[GridInfoServiceConfigSectionName] != null)
2128 retval = config.Configs["GridInfo"].GetString(key, retval); 2124 retval = config.Configs[GridInfoServiceConfigSectionName].GetString(key, retval);
2129 2125
2130 if (String.IsNullOrEmpty(retval)) 2126 if (String.IsNullOrEmpty(retval))
2131 retval = GridUserInfo(InfoType.Custom, key); 2127 retval = GridUserInfo(InfoType.Custom, key);
@@ -2480,7 +2476,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2480 return; 2476 return;
2481 2477
2482 Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); 2478 Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z);
2483 module.MoveToTarget(npcId, World, pos, false, true); 2479 module.MoveToTarget(npcId, World, pos, false, true, false);
2484 } 2480 }
2485 } 2481 }
2486 2482
@@ -2505,7 +2501,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2505 World, 2501 World,
2506 pos, 2502 pos,
2507 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, 2503 (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0,
2508 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0); 2504 (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0,
2505 (options & ScriptBaseClass.OS_NPC_RUNNING) != 0);
2509 } 2506 }
2510 } 2507 }
2511 2508
@@ -2555,7 +2552,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2555 2552
2556 public void osNpcStopMoveToTarget(LSL_Key npc) 2553 public void osNpcStopMoveToTarget(LSL_Key npc)
2557 { 2554 {
2558 CheckThreatLevel(ThreatLevel.VeryLow, "osNpcStopMoveTo"); 2555 CheckThreatLevel(ThreatLevel.High, "osNpcStopMoveToTarget");
2559 m_host.AddScriptLPS(1); 2556 m_host.AddScriptLPS(1);
2560 2557
2561 INPCModule module = World.RequestModuleInterface<INPCModule>(); 2558 INPCModule module = World.RequestModuleInterface<INPCModule>();
@@ -2572,6 +2569,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2572 2569
2573 public void osNpcSay(LSL_Key npc, string message) 2570 public void osNpcSay(LSL_Key npc, string message)
2574 { 2571 {
2572 osNpcSay(npc, 0, message);
2573 }
2574
2575 public void osNpcSay(LSL_Key npc, int channel, string message)
2576 {
2575 CheckThreatLevel(ThreatLevel.High, "osNpcSay"); 2577 CheckThreatLevel(ThreatLevel.High, "osNpcSay");
2576 m_host.AddScriptLPS(1); 2578 m_host.AddScriptLPS(1);
2577 2579
@@ -2583,7 +2585,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2583 if (!module.CheckPermissions(npcId, m_host.OwnerID)) 2585 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2584 return; 2586 return;
2585 2587
2586 module.Say(npcId, World, message); 2588 module.Say(npcId, World, message, channel);
2589 }
2590 }
2591
2592 public void osNpcShout(LSL_Key npc, int channel, string message)
2593 {
2594 CheckThreatLevel(ThreatLevel.High, "osNpcShout");
2595 m_host.AddScriptLPS(1);
2596
2597 INPCModule module = World.RequestModuleInterface<INPCModule>();
2598 if (module != null)
2599 {
2600 UUID npcId = new UUID(npc.m_string);
2601
2602 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2603 return;
2604
2605 module.Shout(npcId, World, message, channel);
2587 } 2606 }
2588 } 2607 }
2589 2608
@@ -2684,6 +2703,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2684 } 2703 }
2685 } 2704 }
2686 2705
2706 public void osNpcWhisper(LSL_Key npc, int channel, string message)
2707 {
2708 CheckThreatLevel(ThreatLevel.High, "osNpcWhisper");
2709 m_host.AddScriptLPS(1);
2710
2711 INPCModule module = World.RequestModuleInterface<INPCModule>();
2712 if (module != null)
2713 {
2714 UUID npcId = new UUID(npc.m_string);
2715
2716 if (!module.CheckPermissions(npcId, m_host.OwnerID))
2717 return;
2718
2719 module.Whisper(npcId, World, message, channel);
2720 }
2721 }
2722
2687 /// <summary> 2723 /// <summary>
2688 /// Save the current appearance of the script owner permanently to the named notecard. 2724 /// Save the current appearance of the script owner permanently to the named notecard.
2689 /// </summary> 2725 /// </summary>
@@ -2835,21 +2871,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2835 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); 2871 CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar");
2836 m_host.AddScriptLPS(1); 2872 m_host.AddScriptLPS(1);
2837 2873
2838 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) 2874 World.ForEachRootScenePresence(delegate(ScenePresence sp)
2839 { 2875 {
2840 World.ForEachRootScenePresence(delegate(ScenePresence sp) 2876 if (sp.Firstname == FirstName && sp.Lastname == SurName)
2841 { 2877 {
2842 if (sp.Firstname == FirstName && sp.Lastname == SurName) 2878 // kick client...
2843 { 2879 if (alert != null)
2844 // kick client... 2880 sp.ControllingClient.Kick(alert);
2845 if (alert != null)
2846 sp.ControllingClient.Kick(alert);
2847 2881
2848 // ...and close on our side 2882 // ...and close on our side
2849 sp.Scene.IncomingCloseAgent(sp.UUID); 2883 sp.Scene.IncomingCloseAgent(sp.UUID);
2850 } 2884 }
2851 }); 2885 });
2852 }
2853 } 2886 }
2854 2887
2855 public void osCauseDamage(string avatar, double damage) 2888 public void osCauseDamage(string avatar, double damage)
@@ -3095,5 +3128,80 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3095 3128
3096 return ScriptBaseClass.TRUE; 3129 return ScriptBaseClass.TRUE;
3097 } 3130 }
3131
3132 /// <summary>
3133 /// Sets terrain estate texture
3134 /// </summary>
3135 /// <param name="level"></param>
3136 /// <param name="texture"></param>
3137 /// <returns></returns>
3138 public void osSetTerrainTexture(int level, LSL_Key texture)
3139 {
3140 CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture");
3141
3142 m_host.AddScriptLPS(1);
3143 //Check to make sure that the script's owner is the estate manager/master
3144 //World.Permissions.GenericEstatePermission(
3145 if (World.Permissions.IsGod(m_host.OwnerID))
3146 {
3147 if (level < 0 || level > 3)
3148 return;
3149
3150 UUID textureID = new UUID();
3151 if (!UUID.TryParse(texture, out textureID))
3152 return;
3153
3154 // estate module is required
3155 IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
3156 if (estate != null)
3157 estate.setEstateTerrainBaseTexture(level, textureID);
3158 }
3159 }
3160
3161 /// <summary>
3162 /// Sets terrain heights of estate
3163 /// </summary>
3164 /// <param name="corner"></param>
3165 /// <param name="low"></param>
3166 /// <param name="high"></param>
3167 /// <returns></returns>
3168 public void osSetTerrainTextureHeight(int corner, double low, double high)
3169 {
3170 CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight");
3171
3172 m_host.AddScriptLPS(1);
3173 //Check to make sure that the script's owner is the estate manager/master
3174 //World.Permissions.GenericEstatePermission(
3175 if (World.Permissions.IsGod(m_host.OwnerID))
3176 {
3177 if (corner < 0 || corner > 3)
3178 return;
3179
3180 // estate module is required
3181 IEstateModule estate = World.RequestModuleInterface<IEstateModule>();
3182 if (estate != null)
3183 estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high);
3184 }
3185 }
3186
3187 public void osForceAttachToAvatar(int attachmentPoint)
3188 {
3189 CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar");
3190
3191 m_host.AddScriptLPS(1);
3192
3193 InitLSL();
3194 ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint);
3195 }
3196
3197 public void osForceDetachFromAvatar()
3198 {
3199 CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar");
3200
3201 m_host.AddScriptLPS(1);
3202
3203 InitLSL();
3204 ((LSL_Api)m_LSL_Api).DetachFromAvatar();
3205 }
3098 } 3206 }
3099} 3207}
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 be5740e..048124d 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();
@@ -346,6 +350,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
346 void llSetLinkTexture(int linknumber, string texture, int face); 350 void llSetLinkTexture(int linknumber, string texture, int face);
347 void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate); 351 void llSetLinkTextureAnim(int linknum, int mode, int face, int sizex, int sizey, double start, double length, double rate);
348 void llSetLocalRot(LSL_Rotation rot); 352 void llSetLocalRot(LSL_Rotation rot);
353 LSL_Integer llSetMemoryLimit(LSL_Integer limit);
349 void llSetObjectDesc(string desc); 354 void llSetObjectDesc(string desc);
350 void llSetObjectName(string name); 355 void llSetObjectName(string name);
351 void llSetObjectPermMask(int mask, int value); 356 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..7382495 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -98,6 +98,20 @@ 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 checking 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 /// Detach the object containing this script from the avatar it is attached to without checking for PERMISSION_ATTACH
111 /// </summary>
112 /// <remarks>Nothing happens if the object is not attached.</remarks>
113 void osForceDetachFromAvatar();
114
101 //texture draw functions 115 //texture draw functions
102 string osMovePen(string drawList, int x, int y); 116 string osMovePen(string drawList, int x, int y);
103 string osDrawLine(string drawList, int startX, int startY, int endX, int endY); 117 string osDrawLine(string drawList, int startX, int startY, int endX, int endY);
@@ -203,11 +217,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
203 void osNpcSetRot(LSL_Key npc, rotation rot); 217 void osNpcSetRot(LSL_Key npc, rotation rot);
204 void osNpcStopMoveToTarget(LSL_Key npc); 218 void osNpcStopMoveToTarget(LSL_Key npc);
205 void osNpcSay(key npc, string message); 219 void osNpcSay(key npc, string message);
220 void osNpcSay(key npc, int channel, string message);
221 void osNpcShout(key npc, int channel, string message);
206 void osNpcSit(key npc, key target, int options); 222 void osNpcSit(key npc, key target, int options);
207 void osNpcStand(LSL_Key npc); 223 void osNpcStand(LSL_Key npc);
208 void osNpcRemove(key npc); 224 void osNpcRemove(key npc);
209 void osNpcPlayAnimation(LSL_Key npc, string animation); 225 void osNpcPlayAnimation(LSL_Key npc, string animation);
210 void osNpcStopAnimation(LSL_Key npc, string animation); 226 void osNpcStopAnimation(LSL_Key npc, string animation);
227 void osNpcWhisper(key npc, int channel, string message);
211 228
212 LSL_Key osOwnerSaveAppearance(string notecard); 229 LSL_Key osOwnerSaveAppearance(string notecard);
213 LSL_Key osAgentSaveAppearance(key agentId, string notecard); 230 LSL_Key osAgentSaveAppearance(key agentId, string notecard);
@@ -234,5 +251,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
234 251
235 LSL_Integer osInviteToGroup(LSL_Key agentId); 252 LSL_Integer osInviteToGroup(LSL_Key agentId);
236 LSL_Integer osEjectFromGroup(LSL_Key agentId); 253 LSL_Integer osEjectFromGroup(LSL_Key agentId);
254
255 void osSetTerrainTexture(int level, LSL_Key texture);
256 void osSetTerrainTextureHeight(int corner, double low, double high);
237 } 257 }
238} 258}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 278f74e..5c6ad8a 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 9ba9561..2d23d30 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs
@@ -376,6 +376,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
376 return m_LSL_Functions.llFrand(mag); 376 return m_LSL_Functions.llFrand(mag);
377 } 377 }
378 378
379 public LSL_Key llGenerateKey()
380 {
381 return m_LSL_Functions.llGenerateKey();
382 }
383
379 public LSL_Vector llGetAccel() 384 public LSL_Vector llGetAccel()
380 { 385 {
381 return m_LSL_Functions.llGetAccel(); 386 return m_LSL_Functions.llGetAccel();
@@ -591,6 +596,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
591 return m_LSL_Functions.llGetMassMKS(); 596 return m_LSL_Functions.llGetMassMKS();
592 } 597 }
593 598
599 public LSL_Integer llGetMemoryLimit()
600 {
601 return m_LSL_Functions.llGetMemoryLimit();
602 }
603
594 public void llGetNextEmail(string address, string subject) 604 public void llGetNextEmail(string address, string subject)
595 { 605 {
596 m_LSL_Functions.llGetNextEmail(address, subject); 606 m_LSL_Functions.llGetNextEmail(address, subject);
@@ -781,6 +791,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
781 return m_LSL_Functions.llGetSimulatorHostname(); 791 return m_LSL_Functions.llGetSimulatorHostname();
782 } 792 }
783 793
794 public LSL_Integer llGetSPMaxMemory()
795 {
796 return m_LSL_Functions.llGetSPMaxMemory();
797 }
798
784 public LSL_Integer llGetStartParameter() 799 public LSL_Integer llGetStartParameter()
785 { 800 {
786 return m_LSL_Functions.llGetStartParameter(); 801 return m_LSL_Functions.llGetStartParameter();
@@ -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);
@@ -1560,6 +1580,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
1560 m_LSL_Functions.llSetLocalRot(rot); 1580 m_LSL_Functions.llSetLocalRot(rot);
1561 } 1581 }
1562 1582
1583 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
1584 {
1585 return m_LSL_Functions.llSetMemoryLimit(limit);
1586 }
1587
1563 public void llSetObjectDesc(string desc) 1588 public void llSetObjectDesc(string desc)
1564 { 1589 {
1565 m_LSL_Functions.llSetObjectDesc(desc); 1590 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..d230662 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -289,8 +289,19 @@ 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 osForceDetachFromAvatar()
300 {
301 m_OSSL_Functions.osForceDetachFromAvatar();
302 }
303
304 // Texture Draw functions
294 305
295 public string osMovePen(string drawList, int x, int y) 306 public string osMovePen(string drawList, int x, int y)
296 { 307 {
@@ -569,6 +580,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
569 m_OSSL_Functions.osNpcSay(npc, message); 580 m_OSSL_Functions.osNpcSay(npc, message);
570 } 581 }
571 582
583 public void osNpcSay(key npc, int channel, string message)
584 {
585 m_OSSL_Functions.osNpcSay(npc, channel, message);
586 }
587
588
589 public void osNpcShout(key npc, int channel, string message)
590 {
591 m_OSSL_Functions.osNpcShout(npc, channel, message);
592 }
593
572 public void osNpcSit(LSL_Key npc, LSL_Key target, int options) 594 public void osNpcSit(LSL_Key npc, LSL_Key target, int options)
573 { 595 {
574 m_OSSL_Functions.osNpcSit(npc, target, options); 596 m_OSSL_Functions.osNpcSit(npc, target, options);
@@ -594,6 +616,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
594 m_OSSL_Functions.osNpcStopAnimation(npc, animation); 616 m_OSSL_Functions.osNpcStopAnimation(npc, animation);
595 } 617 }
596 618
619 public void osNpcWhisper(key npc, int channel, string message)
620 {
621 m_OSSL_Functions.osNpcWhisper(npc, channel, message);
622 }
623
597 public LSL_Key osOwnerSaveAppearance(string notecard) 624 public LSL_Key osOwnerSaveAppearance(string notecard)
598 { 625 {
599 return m_OSSL_Functions.osOwnerSaveAppearance(notecard); 626 return m_OSSL_Functions.osOwnerSaveAppearance(notecard);
@@ -878,5 +905,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
878 { 905 {
879 return m_OSSL_Functions.osEjectFromGroup(agentId); 906 return m_OSSL_Functions.osEjectFromGroup(agentId);
880 } 907 }
908
909 public void osSetTerrainTexture(int level, LSL_Key texture)
910 {
911 m_OSSL_Functions.osSetTerrainTexture(level, texture);
912 }
913
914 public void osSetTerrainTextureHeight(int corner, double low, double high)
915 {
916 m_OSSL_Functions.osSetTerrainTextureHeight(corner, low, high);
917 }
881 } 918 }
882} 919}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 5e68d69..1c59d45 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -232,7 +232,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
232 foreach (string api in am.GetApis()) 232 foreach (string api in am.GetApis())
233 { 233 {
234 m_Apis[api] = am.CreateApi(api); 234 m_Apis[api] = am.CreateApi(api);
235 m_Apis[api].Initialize(engine, part, LocalID, itemID); 235 m_Apis[api].Initialize(engine, part, ScriptTask);
236 } 236 }
237 237
238 try 238 try
@@ -966,7 +966,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
966 public IScriptApi GetApi(string name) 966 public IScriptApi GetApi(string name)
967 { 967 {
968 if (m_Apis.ContainsKey(name)) 968 if (m_Apis.ContainsKey(name))
969 {
970// m_log.DebugFormat("[SCRIPT INSTANCE]: Found api {0} in {1}@{2}", name, ScriptName, PrimName);
971
969 return m_Apis[name]; 972 return m_Apis[name];
973 }
974
975// m_log.DebugFormat("[SCRIPT INSTANCE]: Did not find api {0} in {1}@{2}", name, ScriptName, PrimName);
976
970 return null; 977 return null;
971 } 978 }
972 979
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..bc3b790
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs
@@ -0,0 +1,139 @@
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(m_scene, grp1.RootPart);
93 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
94
95 SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20);
96 grp2.AbsolutePosition = new Vector3(20, 20, 20);
97
98 // <180,0,0>
99 grp2.UpdateGroupRotationR(Quaternion.CreateFromEulers(180 * Utils.DEG_TO_RAD, 0, 0));
100
101 m_scene.AddSceneObject(grp2);
102
103 LSL_Api apiGrp1 = new LSL_Api();
104 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item);
105
106 apiGrp1.llCreateLink(grp2.UUID.ToString(), ScriptBaseClass.TRUE);
107
108 Assert.That(grp1.Parts.Length, Is.EqualTo(4));
109 Assert.That(grp2.IsDeleted, Is.True);
110 }
111
112 [Test]
113 public void TestllBreakLink()
114 {
115 TestHelpers.InMethod();
116
117 UUID ownerId = TestHelpers.ParseTail(0x1);
118
119 SceneObjectGroup grp1 = SceneHelpers.CreateSceneObject(2, ownerId, "grp1-", 0x10);
120 grp1.AbsolutePosition = new Vector3(10, 10, 10);
121 m_scene.AddSceneObject(grp1);
122
123 // FIXME: This should really be a script item (with accompanying script)
124 TaskInventoryItem grp1Item
125 = TaskInventoryHelpers.AddNotecard(m_scene, grp1.RootPart);
126 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
127
128 LSL_Api apiGrp1 = new LSL_Api();
129 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item);
130
131 apiGrp1.llBreakLink(2);
132
133 Assert.That(grp1.Parts.Length, Is.EqualTo(1));
134
135 SceneObjectGroup grp2 = m_scene.GetSceneObjectGroup("grp1-Part1");
136 Assert.That(grp2, Is.Not.Null);
137 }
138 }
139} \ 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..f96a156 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
@@ -58,7 +58,7 @@ 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);
63 63
64 XEngine.XEngine engine = new XEngine.XEngine(); 64 XEngine.XEngine engine = new XEngine.XEngine();
@@ -66,8 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
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..3965734 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();
@@ -95,7 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
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);
@@ -130,7 +130,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
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);
@@ -161,7 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
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
@@ -202,7 +202,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
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_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index 9d9fc51..0ccd889 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -68,7 +68,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
68 config = initConfigSource.AddConfig("NPC"); 68 config = initConfigSource.AddConfig("NPC");
69 config.Set("Enabled", "true"); 69 config.Set("Enabled", "true");
70 70
71 m_scene = SceneHelpers.SetupScene(); 71 m_scene = new SceneHelpers().SetupScene();
72 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule()); 72 SceneHelpers.SetupSceneModules(m_scene, initConfigSource, new AvatarFactoryModule(), new NPCModule());
73 73
74 m_engine = new XEngine.XEngine(); 74 m_engine = new XEngine.XEngine();
@@ -104,10 +104,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
104 m_scene.AddSceneObject(otherSo); 104 m_scene.AddSceneObject(otherSo);
105 105
106 OSSL_Api osslApi = new OSSL_Api(); 106 OSSL_Api osslApi = new OSSL_Api();
107 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 107 osslApi.Initialize(m_engine, part, null);
108 108
109 OSSL_Api otherOsslApi = new OSSL_Api(); 109 OSSL_Api otherOsslApi = new OSSL_Api();
110 otherOsslApi.Initialize(m_engine, otherPart, otherPart.LocalId, otherPart.UUID); 110 otherOsslApi.Initialize(m_engine, otherPart, null);
111 111
112 string notecardName = "appearanceNc"; 112 string notecardName = "appearanceNc";
113 osslApi.osOwnerSaveAppearance(notecardName); 113 osslApi.osOwnerSaveAppearance(notecardName);
@@ -151,7 +151,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
151 m_scene.AddSceneObject(so); 151 m_scene.AddSceneObject(so);
152 152
153 OSSL_Api osslApi = new OSSL_Api(); 153 OSSL_Api osslApi = new OSSL_Api();
154 osslApi.Initialize(m_engine, part, part.LocalId, part.UUID); 154 osslApi.Initialize(m_engine, part, null);
155 155
156 string notecardName = "appearanceNc"; 156 string notecardName = "appearanceNc";
157 osslApi.osOwnerSaveAppearance(notecardName); 157 osslApi.osOwnerSaveAppearance(notecardName);
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
index 7d7bd82..a3f848c 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/Tests/XEngineTest.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
73 // to AssemblyResolver.OnAssemblyResolve fails. 73 // to AssemblyResolver.OnAssemblyResolve fails.
74 xEngineConfig.Set("AppDomainLoading", "false"); 74 xEngineConfig.Set("AppDomainLoading", "false");
75 75
76 m_scene = SceneHelpers.SetupScene("My Test", UUID.Random(), 1000, 1000, null, configSource); 76 m_scene = new SceneHelpers().SetupScene("My Test", UUID.Random(), 1000, 1000, configSource);
77 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule); 77 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine, wcModule);
78 m_scene.StartScripts(); 78 m_scene.StartScripts();
79 } 79 }
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 1e0f01f..eeb125e 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1089,11 +1089,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1089 1089
1090 AppDomain sandbox; 1090 AppDomain sandbox;
1091 if (m_AppDomainLoading) 1091 if (m_AppDomainLoading)
1092 {
1092 sandbox = AppDomain.CreateDomain( 1093 sandbox = AppDomain.CreateDomain(
1093 m_Scene.RegionInfo.RegionID.ToString(), 1094 m_Scene.RegionInfo.RegionID.ToString(),
1094 evidence, appSetup); 1095 evidence, appSetup);
1096 m_AppDomains[appDomain].AssemblyResolve +=
1097 new ResolveEventHandler(
1098 AssemblyResolver.OnAssemblyResolve);
1099 }
1095 else 1100 else
1101 {
1096 sandbox = AppDomain.CurrentDomain; 1102 sandbox = AppDomain.CurrentDomain;
1103 }
1097 1104
1098 //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel(); 1105 //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel();
1099 //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition(); 1106 //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition();
@@ -1105,9 +1112,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1105 1112
1106 m_AppDomains[appDomain] = sandbox; 1113 m_AppDomains[appDomain] = sandbox;
1107 1114
1108 m_AppDomains[appDomain].AssemblyResolve +=
1109 new ResolveEventHandler(
1110 AssemblyResolver.OnAssemblyResolve);
1111 m_DomainScripts[appDomain] = new List<UUID>(); 1115 m_DomainScripts[appDomain] = new List<UUID>();
1112 } 1116 }
1113 catch (Exception e) 1117 catch (Exception e)
@@ -1898,9 +1902,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1898 // if there already exists a file at that location, it may be locked. 1902 // if there already exists a file at that location, it may be locked.
1899 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); 1903 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message);
1900 } 1904 }
1905
1906 string textpath = path + ".text";
1901 try 1907 try
1902 { 1908 {
1903 using (FileStream fs = File.Create(path + ".text")) 1909 using (FileStream fs = File.Create(textpath))
1904 { 1910 {
1905 using (StreamWriter sw = new StreamWriter(fs)) 1911 using (StreamWriter sw = new StreamWriter(fs))
1906 { 1912 {
@@ -1913,7 +1919,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1913 catch (IOException ex) 1919 catch (IOException ex)
1914 { 1920 {
1915 // if there already exists a file at that location, it may be locked. 1921 // if there already exists a file at that location, it may be locked.
1916 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", path, ex.Message); 1922 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", textpath, ex.Message);
1917 } 1923 }
1918 } 1924 }
1919 } 1925 }
@@ -1962,7 +1968,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1962 catch (IOException ex) 1968 catch (IOException ex)
1963 { 1969 {
1964 // if there already exists a file at that location, it may be locked. 1970 // if there already exists a file at that location, it may be locked.
1965 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", statepath, ex.Message); 1971 m_log.ErrorFormat("[XEngine]: File {0} already exists! {1}", mappath, ex.Message);
1966 } 1972 }
1967 } 1973 }
1968 1974
@@ -1997,45 +2003,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1997 if (!topScripts.ContainsKey(si.LocalID)) 2003 if (!topScripts.ContainsKey(si.LocalID))
1998 topScripts[si.RootLocalID] = 0; 2004 topScripts[si.RootLocalID] = 0;
1999 2005
2000// long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; 2006 topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow);
2001// float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); 2007 }
2002 2008 }
2003 // Execution time of the script adjusted by it's measurement period to make scripts started at
2004 // different times comparable.
2005// float adjustedExecutionTime
2006// = (float)si.MeasurementPeriodExecutionTime
2007// / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod)
2008// / TimeSpan.TicksPerMillisecond;
2009
2010 long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
2011
2012 // Avoid divide by zerp
2013 if (ticksElapsed == 0)
2014 ticksElapsed = 1;
2015 2009
2016 // Scale execution time to the ideal 55 fps frame time for these reasons. 2010 return topScripts;
2017 // 2011 }
2018 // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no
2019 // 'script execution time per frame', which is the original purpose of this value.
2020 //
2021 // 2) Giving the raw execution times is misleading since scripts start at different times, making
2022 // it impossible to compare scripts.
2023 //
2024 // 3) Scaling the raw execution time to the time that the script has been running is better but
2025 // is still misleading since a script that has just been rezzed may appear to have been running
2026 // for much longer.
2027 //
2028 // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect
2029 // since the figure does not represent actual execution time and very hard running scripts will
2030 // never exceed 18ms (though this is a very high number for script execution so is a warning sign).
2031 float adjustedExecutionTime
2032 = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f;
2033 2012
2034 topScripts[si.RootLocalID] += adjustedExecutionTime; 2013 public float GetScriptExecutionTime(List<UUID> itemIDs)
2014 {
2015 if (itemIDs == null|| itemIDs.Count == 0)
2016 {
2017 return 0.0f;
2018 }
2019 float time = 0.0f;
2020 long tickNow = Util.EnvironmentTickCount();
2021 IScriptInstance si;
2022 // Calculate the time for all scripts that this engine is executing
2023 // Ignore any others
2024 foreach (UUID id in itemIDs)
2025 {
2026 si = GetInstance(id);
2027 if (si != null && si.Running)
2028 {
2029 time += CalculateAdjustedExectionTime(si, tickNow);
2035 } 2030 }
2036 } 2031 }
2032 return time;
2033 }
2037 2034
2038 return topScripts; 2035 private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow)
2036 {
2037 long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
2038
2039 // Avoid divide by zero
2040 if (ticksElapsed == 0)
2041 ticksElapsed = 1;
2042
2043 // Scale execution time to the ideal 55 fps frame time for these reasons.
2044 //
2045 // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no
2046 // 'script execution time per frame', which is the original purpose of this value.
2047 //
2048 // 2) Giving the raw execution times is misleading since scripts start at different times, making
2049 // it impossible to compare scripts.
2050 //
2051 // 3) Scaling the raw execution time to the time that the script has been running is better but
2052 // is still misleading since a script that has just been rezzed may appear to have been running
2053 // for much longer.
2054 //
2055 // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect
2056 // since the figure does not represent actual execution time and very hard running scripts will
2057 // never exceed 18ms (though this is a very high number for script execution so is a warning sign).
2058 return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f;
2039 } 2059 }
2040 2060
2041 public void SuspendScript(UUID itemID) 2061 public void SuspendScript(UUID itemID)