aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation')
-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
7 files changed, 588 insertions, 664 deletions
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 ec0966b..3b8efd5 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -88,8 +88,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
89 protected IScriptEngine m_ScriptEngine; 89 protected IScriptEngine m_ScriptEngine;
90 protected SceneObjectPart m_host; 90 protected SceneObjectPart m_host;
91 protected uint m_localID; 91
92 protected UUID m_itemID; 92 /// <summary>
93 /// The item that hosts this script
94 /// </summary>
95 protected TaskInventoryItem m_item;
96
93 protected bool throwErrorOnNotImplemented = true; 97 protected bool throwErrorOnNotImplemented = true;
94 protected AsyncCommandManager AsyncCommands = null; 98 protected AsyncCommandManager AsyncCommands = null;
95 protected float m_ScriptDelayFactor = 1.0f; 99 protected float m_ScriptDelayFactor = 1.0f;
@@ -107,6 +111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
107 protected IUrlModule m_UrlModule = null; 111 protected IUrlModule m_UrlModule = null;
108 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = 112 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache =
109 new Dictionary<UUID, UserInfoCacheEntry>(); 113 new Dictionary<UUID, UserInfoCacheEntry>();
114 protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp.
110 115
111 protected Timer m_ShoutSayTimer; 116 protected Timer m_ShoutSayTimer;
112 protected int m_SayShoutCount = 0; 117 protected int m_SayShoutCount = 0;
@@ -133,7 +138,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
133 {"TURNRIGHT", "Turning Right"} 138 {"TURNRIGHT", "Turning Right"}
134 }; 139 };
135 140
136 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 141 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
137 { 142 {
138 m_ShoutSayTimer = new Timer(1000); 143 m_ShoutSayTimer = new Timer(1000);
139 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed; 144 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed;
@@ -142,10 +147,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
142 147
143 m_ScriptEngine = ScriptEngine; 148 m_ScriptEngine = ScriptEngine;
144 m_host = host; 149 m_host = host;
145 m_localID = localID; 150 m_item = item;
146 m_itemID = itemID;
147 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 151 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
148 152
153 LoadLimits(); // read script limits from config.
154
155 m_TransferModule =
156 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>();
157 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
158
159 AsyncCommands = new AsyncCommandManager(ScriptEngine);
160 }
161
162 /* load configuration items that affect script, object and run-time behavior. */
163 private void LoadLimits()
164 {
149 m_ScriptDelayFactor = 165 m_ScriptDelayFactor =
150 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); 166 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f);
151 m_ScriptDistanceFactor = 167 m_ScriptDistanceFactor =
@@ -158,12 +174,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
158 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); 174 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255);
159 if (m_notecardLineReadCharsMax > 65535) 175 if (m_notecardLineReadCharsMax > 65535)
160 m_notecardLineReadCharsMax = 65535; 176 m_notecardLineReadCharsMax = 65535;
161 177 // load limits for particular subsystems.
162 m_TransferModule = 178 IConfig SMTPConfig;
163 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); 179 if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) {
164 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); 180 // there's an smtp config, so load in the snooze time.
165 181 EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME);
166 AsyncCommands = new AsyncCommandManager(ScriptEngine); 182 }
167 } 183 }
168 184
169 public override Object InitializeLifetimeService() 185 public override Object InitializeLifetimeService()
@@ -195,7 +211,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
195 [DebuggerNonUserCode] 211 [DebuggerNonUserCode]
196 public void state(string newState) 212 public void state(string newState)
197 { 213 {
198 m_ScriptEngine.SetState(m_itemID, newState); 214 m_ScriptEngine.SetState(m_item.ItemID, newState);
199 } 215 }
200 216
201 /// <summary> 217 /// <summary>
@@ -206,7 +222,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
206 public void llResetScript() 222 public void llResetScript()
207 { 223 {
208 m_host.AddScriptLPS(1); 224 m_host.AddScriptLPS(1);
209 m_ScriptEngine.ApiResetScript(m_itemID); 225 m_ScriptEngine.ApiResetScript(m_item.ItemID);
210 } 226 }
211 227
212 public void llResetOtherScript(string name) 228 public void llResetOtherScript(string name)
@@ -358,77 +374,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
358 } 374 }
359 } 375 }
360 376
361 protected UUID InventorySelf()
362 {
363 UUID invItemID = new UUID();
364 bool unlock = false;
365 if (!m_host.TaskInventory.IsReadLockedByMe())
366 {
367 m_host.TaskInventory.LockItemsForRead(true);
368 unlock = true;
369 }
370 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
371 {
372 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
373 {
374 invItemID = inv.Key;
375 break;
376 }
377 }
378 if (unlock)
379 {
380 m_host.TaskInventory.LockItemsForRead(false);
381 }
382 return invItemID;
383 }
384
385 protected UUID InventoryKey(string name, int type) 377 protected UUID InventoryKey(string name, int type)
386 { 378 {
387 m_host.AddScriptLPS(1); 379 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
388 m_host.TaskInventory.LockItemsForRead(true);
389
390 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
391 {
392 if (inv.Value.Name == name)
393 {
394 m_host.TaskInventory.LockItemsForRead(false);
395
396 if (inv.Value.Type != type)
397 {
398 return UUID.Zero;
399 }
400
401 return inv.Value.AssetID;
402 }
403 }
404
405 m_host.TaskInventory.LockItemsForRead(false);
406 return UUID.Zero;
407 }
408
409 protected UUID InventoryKey(string name)
410 {
411 m_host.AddScriptLPS(1);
412 380
413 381 if (item != null && item.Type == type)
414 m_host.TaskInventory.LockItemsForRead(true); 382 return item.AssetID;
415 383 else
416 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 384 return UUID.Zero;
417 {
418 if (inv.Value.Name == name)
419 {
420 m_host.TaskInventory.LockItemsForRead(false);
421 return inv.Value.AssetID;
422 }
423 }
424
425 m_host.TaskInventory.LockItemsForRead(false);
426
427
428 return UUID.Zero;
429 } 385 }
430 386
431
432 /// <summary> 387 /// <summary>
433 /// accepts a valid UUID, -or- a name of an inventory item. 388 /// accepts a valid UUID, -or- a name of an inventory item.
434 /// Returns a valid UUID or UUID.Zero if key invalid and item not found 389 /// Returns a valid UUID or UUID.Zero if key invalid and item not found
@@ -438,19 +393,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
438 /// <returns></returns> 393 /// <returns></returns>
439 protected UUID KeyOrName(string k) 394 protected UUID KeyOrName(string k)
440 { 395 {
441 UUID key = UUID.Zero; 396 UUID key;
442 397
443 // if we can parse the string as a key, use it. 398 // if we can parse the string as a key, use it.
444 if (UUID.TryParse(k, out key))
445 {
446 return key;
447 }
448 // else try to locate the name in inventory of object. found returns key, 399 // else try to locate the name in inventory of object. found returns key,
449 // not found returns UUID.Zero which will translate to the default particle texture 400 // not found returns UUID.Zero
450 else 401 if (!UUID.TryParse(k, out key))
451 { 402 {
452 return InventoryKey(k); 403 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
404
405 if (item != null)
406 key = item.AssetID;
407 else
408 key = UUID.Zero;
453 } 409 }
410
411 return key;
454 } 412 }
455 413
456 // convert a LSL_Rotation to a Quaternion 414 // convert a LSL_Rotation to a Quaternion
@@ -963,20 +921,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
963 921
964 public void llRegionSayTo(string target, int channel, string msg) 922 public void llRegionSayTo(string target, int channel, string msg)
965 { 923 {
966 string error = String.Empty;
967
968 if (msg.Length > 1023) 924 if (msg.Length > 1023)
969 msg = msg.Substring(0, 1023); 925 msg = msg.Substring(0, 1023);
970 926
971 m_host.AddScriptLPS(1); 927 m_host.AddScriptLPS(1);
972 928
929 if (channel == ScriptBaseClass.DEBUG_CHANNEL)
930 {
931 return;
932 }
933
973 UUID TargetID; 934 UUID TargetID;
974 UUID.TryParse(target, out TargetID); 935 UUID.TryParse(target, out TargetID);
975 936
976 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 937 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
977 if (wComm != null) 938 if (wComm != null)
978 if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error)) 939 wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg);
979 LSLError(error);
980 } 940 }
981 941
982 public LSL_Integer llListen(int channelID, string name, string ID, string msg) 942 public LSL_Integer llListen(int channelID, string name, string ID, string msg)
@@ -986,7 +946,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
986 UUID.TryParse(ID, out keyID); 946 UUID.TryParse(ID, out keyID);
987 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 947 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
988 if (wComm != null) 948 if (wComm != null)
989 return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); 949 return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg);
990 else 950 else
991 return -1; 951 return -1;
992 } 952 }
@@ -996,7 +956,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
996 m_host.AddScriptLPS(1); 956 m_host.AddScriptLPS(1);
997 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 957 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
998 if (wComm != null) 958 if (wComm != null)
999 wComm.ListenControl(m_itemID, number, active); 959 wComm.ListenControl(m_item.ItemID, number, active);
1000 } 960 }
1001 961
1002 public void llListenRemove(int number) 962 public void llListenRemove(int number)
@@ -1004,7 +964,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1004 m_host.AddScriptLPS(1); 964 m_host.AddScriptLPS(1);
1005 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 965 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
1006 if (wComm != null) 966 if (wComm != null)
1007 wComm.ListenRemove(m_itemID, number); 967 wComm.ListenRemove(m_item.ItemID, number);
1008 } 968 }
1009 969
1010 public void llSensor(string name, string id, int type, double range, double arc) 970 public void llSensor(string name, string id, int type, double range, double arc)
@@ -1013,7 +973,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1013 UUID keyID = UUID.Zero; 973 UUID keyID = UUID.Zero;
1014 UUID.TryParse(id, out keyID); 974 UUID.TryParse(id, out keyID);
1015 975
1016 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); 976 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host);
1017 } 977 }
1018 978
1019 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) 979 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate)
@@ -1022,13 +982,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1022 UUID keyID = UUID.Zero; 982 UUID keyID = UUID.Zero;
1023 UUID.TryParse(id, out keyID); 983 UUID.TryParse(id, out keyID);
1024 984
1025 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); 985 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host);
1026 } 986 }
1027 987
1028 public void llSensorRemove() 988 public void llSensorRemove()
1029 { 989 {
1030 m_host.AddScriptLPS(1); 990 m_host.AddScriptLPS(1);
1031 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); 991 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID);
1032 } 992 }
1033 993
1034 public string resolveName(UUID objecUUID) 994 public string resolveName(UUID objecUUID)
@@ -1069,7 +1029,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1069 public LSL_String llDetectedName(int number) 1029 public LSL_String llDetectedName(int number)
1070 { 1030 {
1071 m_host.AddScriptLPS(1); 1031 m_host.AddScriptLPS(1);
1072 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1032 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1073 if (detectedParams == null) 1033 if (detectedParams == null)
1074 return String.Empty; 1034 return String.Empty;
1075 return detectedParams.Name; 1035 return detectedParams.Name;
@@ -1078,7 +1038,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1078 public LSL_String llDetectedKey(int number) 1038 public LSL_String llDetectedKey(int number)
1079 { 1039 {
1080 m_host.AddScriptLPS(1); 1040 m_host.AddScriptLPS(1);
1081 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1041 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1082 if (detectedParams == null) 1042 if (detectedParams == null)
1083 return String.Empty; 1043 return String.Empty;
1084 return detectedParams.Key.ToString(); 1044 return detectedParams.Key.ToString();
@@ -1087,7 +1047,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1087 public LSL_String llDetectedOwner(int number) 1047 public LSL_String llDetectedOwner(int number)
1088 { 1048 {
1089 m_host.AddScriptLPS(1); 1049 m_host.AddScriptLPS(1);
1090 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1050 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1091 if (detectedParams == null) 1051 if (detectedParams == null)
1092 return String.Empty; 1052 return String.Empty;
1093 return detectedParams.Owner.ToString(); 1053 return detectedParams.Owner.ToString();
@@ -1096,7 +1056,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1096 public LSL_Integer llDetectedType(int number) 1056 public LSL_Integer llDetectedType(int number)
1097 { 1057 {
1098 m_host.AddScriptLPS(1); 1058 m_host.AddScriptLPS(1);
1099 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1059 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1100 if (detectedParams == null) 1060 if (detectedParams == null)
1101 return 0; 1061 return 0;
1102 return new LSL_Integer(detectedParams.Type); 1062 return new LSL_Integer(detectedParams.Type);
@@ -1105,7 +1065,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1105 public LSL_Vector llDetectedPos(int number) 1065 public LSL_Vector llDetectedPos(int number)
1106 { 1066 {
1107 m_host.AddScriptLPS(1); 1067 m_host.AddScriptLPS(1);
1108 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1068 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1109 if (detectedParams == null) 1069 if (detectedParams == null)
1110 return new LSL_Vector(); 1070 return new LSL_Vector();
1111 return detectedParams.Position; 1071 return detectedParams.Position;
@@ -1114,7 +1074,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1114 public LSL_Vector llDetectedVel(int number) 1074 public LSL_Vector llDetectedVel(int number)
1115 { 1075 {
1116 m_host.AddScriptLPS(1); 1076 m_host.AddScriptLPS(1);
1117 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1077 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1118 if (detectedParams == null) 1078 if (detectedParams == null)
1119 return new LSL_Vector(); 1079 return new LSL_Vector();
1120 return detectedParams.Velocity; 1080 return detectedParams.Velocity;
@@ -1123,7 +1083,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1123 public LSL_Vector llDetectedGrab(int number) 1083 public LSL_Vector llDetectedGrab(int number)
1124 { 1084 {
1125 m_host.AddScriptLPS(1); 1085 m_host.AddScriptLPS(1);
1126 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1086 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1127 if (parms == null) 1087 if (parms == null)
1128 return new LSL_Vector(0, 0, 0); 1088 return new LSL_Vector(0, 0, 0);
1129 1089
@@ -1133,7 +1093,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1133 public LSL_Rotation llDetectedRot(int number) 1093 public LSL_Rotation llDetectedRot(int number)
1134 { 1094 {
1135 m_host.AddScriptLPS(1); 1095 m_host.AddScriptLPS(1);
1136 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1096 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1137 if (detectedParams == null) 1097 if (detectedParams == null)
1138 return new LSL_Rotation(); 1098 return new LSL_Rotation();
1139 return detectedParams.Rotation; 1099 return detectedParams.Rotation;
@@ -1142,7 +1102,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1142 public LSL_Integer llDetectedGroup(int number) 1102 public LSL_Integer llDetectedGroup(int number)
1143 { 1103 {
1144 m_host.AddScriptLPS(1); 1104 m_host.AddScriptLPS(1);
1145 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1105 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1146 if (detectedParams == null) 1106 if (detectedParams == null)
1147 return new LSL_Integer(0); 1107 return new LSL_Integer(0);
1148 if (m_host.GroupID == detectedParams.Group) 1108 if (m_host.GroupID == detectedParams.Group)
@@ -1153,7 +1113,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1153 public LSL_Integer llDetectedLinkNumber(int number) 1113 public LSL_Integer llDetectedLinkNumber(int number)
1154 { 1114 {
1155 m_host.AddScriptLPS(1); 1115 m_host.AddScriptLPS(1);
1156 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1116 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1157 if (parms == null) 1117 if (parms == null)
1158 return new LSL_Integer(0); 1118 return new LSL_Integer(0);
1159 1119
@@ -1166,7 +1126,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1166 public LSL_Vector llDetectedTouchBinormal(int index) 1126 public LSL_Vector llDetectedTouchBinormal(int index)
1167 { 1127 {
1168 m_host.AddScriptLPS(1); 1128 m_host.AddScriptLPS(1);
1169 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1129 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1170 if (detectedParams == null) 1130 if (detectedParams == null)
1171 return new LSL_Vector(); 1131 return new LSL_Vector();
1172 return detectedParams.TouchBinormal; 1132 return detectedParams.TouchBinormal;
@@ -1178,7 +1138,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1178 public LSL_Integer llDetectedTouchFace(int index) 1138 public LSL_Integer llDetectedTouchFace(int index)
1179 { 1139 {
1180 m_host.AddScriptLPS(1); 1140 m_host.AddScriptLPS(1);
1181 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1141 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1182 if (detectedParams == null) 1142 if (detectedParams == null)
1183 return new LSL_Integer(-1); 1143 return new LSL_Integer(-1);
1184 return new LSL_Integer(detectedParams.TouchFace); 1144 return new LSL_Integer(detectedParams.TouchFace);
@@ -1190,7 +1150,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1190 public LSL_Vector llDetectedTouchNormal(int index) 1150 public LSL_Vector llDetectedTouchNormal(int index)
1191 { 1151 {
1192 m_host.AddScriptLPS(1); 1152 m_host.AddScriptLPS(1);
1193 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1153 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1194 if (detectedParams == null) 1154 if (detectedParams == null)
1195 return new LSL_Vector(); 1155 return new LSL_Vector();
1196 return detectedParams.TouchNormal; 1156 return detectedParams.TouchNormal;
@@ -1202,7 +1162,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1202 public LSL_Vector llDetectedTouchPos(int index) 1162 public LSL_Vector llDetectedTouchPos(int index)
1203 { 1163 {
1204 m_host.AddScriptLPS(1); 1164 m_host.AddScriptLPS(1);
1205 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1165 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1206 if (detectedParams == null) 1166 if (detectedParams == null)
1207 return new LSL_Vector(); 1167 return new LSL_Vector();
1208 return detectedParams.TouchPos; 1168 return detectedParams.TouchPos;
@@ -1214,7 +1174,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1214 public LSL_Vector llDetectedTouchST(int index) 1174 public LSL_Vector llDetectedTouchST(int index)
1215 { 1175 {
1216 m_host.AddScriptLPS(1); 1176 m_host.AddScriptLPS(1);
1217 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1177 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1218 if (detectedParams == null) 1178 if (detectedParams == null)
1219 return new LSL_Vector(-1.0, -1.0, 0.0); 1179 return new LSL_Vector(-1.0, -1.0, 0.0);
1220 return detectedParams.TouchST; 1180 return detectedParams.TouchST;
@@ -1226,7 +1186,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1226 public LSL_Vector llDetectedTouchUV(int index) 1186 public LSL_Vector llDetectedTouchUV(int index)
1227 { 1187 {
1228 m_host.AddScriptLPS(1); 1188 m_host.AddScriptLPS(1);
1229 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1189 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1230 if (detectedParams == null) 1190 if (detectedParams == null)
1231 return new LSL_Vector(-1.0, -1.0, 0.0); 1191 return new LSL_Vector(-1.0, -1.0, 0.0);
1232 return detectedParams.TouchUV; 1192 return detectedParams.TouchUV;
@@ -1929,12 +1889,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1929 1889
1930 return rgb; 1890 return rgb;
1931 } 1891 }
1892
1932 if (face >= 0 && face < GetNumberOfSides(part)) 1893 if (face >= 0 && face < GetNumberOfSides(part))
1933 { 1894 {
1934 texcolor = tex.GetFace((uint)face).RGBA; 1895 texcolor = tex.GetFace((uint)face).RGBA;
1935 rgb.x = texcolor.R; 1896 rgb.x = texcolor.R;
1936 rgb.y = texcolor.G; 1897 rgb.y = texcolor.G;
1937 rgb.z = texcolor.B; 1898 rgb.z = texcolor.B;
1899
1938 return rgb; 1900 return rgb;
1939 } 1901 }
1940 else 1902 else
@@ -2974,20 +2936,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2974 2936
2975 public LSL_Integer llGiveMoney(string destination, int amount) 2937 public LSL_Integer llGiveMoney(string destination, int amount)
2976 { 2938 {
2977 UUID invItemID=InventorySelf();
2978 if (invItemID == UUID.Zero)
2979 return 0;
2980
2981 m_host.AddScriptLPS(1); 2939 m_host.AddScriptLPS(1);
2982 2940
2983 m_host.TaskInventory.LockItemsForRead(true); 2941 if (m_item.PermsGranter == UUID.Zero)
2984 TaskInventoryItem item = m_host.TaskInventory[invItemID];
2985 m_host.TaskInventory.LockItemsForRead(false);
2986
2987 if (item.PermsGranter == UUID.Zero)
2988 return 0; 2942 return 0;
2989 2943
2990 if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) 2944 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0)
2991 { 2945 {
2992 LSLError("No permissions to give money"); 2946 LSLError("No permissions to give money");
2993 return 0; 2947 return 0;
@@ -3174,11 +3128,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3174 sec = m_MinTimerInterval; 3128 sec = m_MinTimerInterval;
3175 m_host.AddScriptLPS(1); 3129 m_host.AddScriptLPS(1);
3176 // Setting timer repeat 3130 // Setting timer repeat
3177 AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); 3131 AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec);
3178 } 3132 }
3179 3133
3180 public virtual void llSleep(double sec) 3134 public virtual void llSleep(double sec)
3181 { 3135 {
3136// m_log.Info("llSleep snoozing " + sec + "s.");
3182 m_host.AddScriptLPS(1); 3137 m_host.AddScriptLPS(1);
3183 Thread.Sleep((int)(sec * 1000)); 3138 Thread.Sleep((int)(sec * 1000));
3184 } 3139 }
@@ -3237,29 +3192,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3237 3192
3238 public void llTakeControls(int controls, int accept, int pass_on) 3193 public void llTakeControls(int controls, int accept, int pass_on)
3239 { 3194 {
3240 TaskInventoryItem item; 3195 if (m_item.PermsGranter != UUID.Zero)
3241
3242 m_host.TaskInventory.LockItemsForRead(true);
3243 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3244 { 3196 {
3245 m_host.TaskInventory.LockItemsForRead(false); 3197 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3246 return;
3247 }
3248 else
3249 {
3250 item = m_host.TaskInventory[InventorySelf()];
3251 }
3252 m_host.TaskInventory.LockItemsForRead(false);
3253
3254 if (item.PermsGranter != UUID.Zero)
3255 {
3256 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3257 3198
3258 if (presence != null) 3199 if (presence != null)
3259 { 3200 {
3260 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3201 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3261 { 3202 {
3262 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); 3203 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID);
3263 } 3204 }
3264 } 3205 }
3265 } 3206 }
@@ -3269,38 +3210,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3269 3210
3270 public void llReleaseControls() 3211 public void llReleaseControls()
3271 { 3212 {
3272 TaskInventoryItem item;
3273
3274 m_host.TaskInventory.LockItemsForRead(true);
3275 lock (m_host.TaskInventory)
3276 {
3277
3278 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3279 {
3280 m_host.TaskInventory.LockItemsForRead(false);
3281 return;
3282 }
3283 else
3284 {
3285 item = m_host.TaskInventory[InventorySelf()];
3286 }
3287 }
3288 m_host.TaskInventory.LockItemsForRead(false);
3289
3290 m_host.AddScriptLPS(1); 3213 m_host.AddScriptLPS(1);
3291 3214
3292 if (item.PermsGranter != UUID.Zero) 3215 if (m_item.PermsGranter != UUID.Zero)
3293 { 3216 {
3294 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3217 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3295 3218
3296 if (presence != null) 3219 if (presence != null)
3297 { 3220 {
3298 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3221 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3299 { 3222 {
3300 // Unregister controls from Presence 3223 // Unregister controls from Presence
3301 presence.UnRegisterControlEventsToScript(m_localID, m_itemID); 3224 presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
3302 // Remove Take Control permission. 3225 // Remove Take Control permission.
3303 item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; 3226 m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
3304 } 3227 }
3305 } 3228 }
3306 } 3229 }
@@ -3313,86 +3236,71 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3313 m_UrlModule.ReleaseURL(url); 3236 m_UrlModule.ReleaseURL(url);
3314 } 3237 }
3315 3238
3316 public void llAttachToAvatar(int attachment) 3239 /// <summary>
3240 /// Attach the object containing this script to the avatar that owns it.
3241 /// </summary>
3242 /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param>
3243 /// <returns>true if the attach suceeded, false if it did not</returns>
3244 public bool AttachToAvatar(int attachmentPoint)
3317 { 3245 {
3318 m_host.AddScriptLPS(1); 3246 SceneObjectGroup grp = m_host.ParentGroup;
3247 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
3319 3248
3320 TaskInventoryItem item; 3249 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3321
3322 m_host.TaskInventory.LockItemsForRead(true);
3323 3250
3324 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3251 if (attachmentsModule != null)
3325 { 3252 return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false);
3326 m_host.TaskInventory.LockItemsForRead(false);
3327 return;
3328 }
3329 else 3253 else
3330 { 3254 return false;
3331 item = m_host.TaskInventory[InventorySelf()]; 3255 }
3332 }
3333
3334 m_host.TaskInventory.LockItemsForRead(false);
3335 3256
3336 if (item.PermsGranter != m_host.OwnerID) 3257 /// <summary>
3337 return; 3258 /// Detach the object containing this script from the avatar it is attached to.
3259 /// </summary>
3260 /// <remarks>
3261 /// Nothing happens if the object is not attached.
3262 /// </remarks>
3263 public void DetachFromAvatar()
3264 {
3265 Util.FireAndForget(DetachWrapper, m_host);
3266 }
3338 3267
3339 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3268 private void DetachWrapper(object o)
3340 { 3269 {
3341 SceneObjectGroup grp = m_host.ParentGroup; 3270 SceneObjectPart host = (SceneObjectPart)o;
3342 3271
3343 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 3272 SceneObjectGroup grp = host.ParentGroup;
3273 UUID itemID = grp.FromItemID;
3274 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3344 3275
3345 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; 3276 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3346 if (attachmentsModule != null) 3277 if (attachmentsModule != null)
3347 attachmentsModule.AttachObject(presence, grp, (uint)attachment, false); 3278 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3348 }
3349 } 3279 }
3350 3280
3351 public void llDetachFromAvatar() 3281 public void llAttachToAvatar(int attachmentPoint)
3352 { 3282 {
3353 m_host.AddScriptLPS(1); 3283 m_host.AddScriptLPS(1);
3354 3284
3355 if (m_host.ParentGroup.AttachmentPoint == 0) 3285 if (m_item.PermsGranter != m_host.OwnerID)
3356 return; 3286 return;
3357 3287
3358 TaskInventoryItem item; 3288 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3289 AttachToAvatar(attachmentPoint);
3290 }
3359 3291
3360 m_host.TaskInventory.LockItemsForRead(true); 3292 public void llDetachFromAvatar()
3293 {
3294 m_host.AddScriptLPS(1);
3361 3295
3362 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3296 if (m_host.ParentGroup.AttachmentPoint == 0)
3363 {
3364 m_host.TaskInventory.LockItemsForRead(false);
3365 return; 3297 return;
3366 }
3367 else
3368 {
3369 item = m_host.TaskInventory[InventorySelf()];
3370 }
3371 m_host.TaskInventory.LockItemsForRead(false);
3372
3373 3298
3374 if (item.PermsGranter != m_host.OwnerID) 3299 if (m_item.PermsGranter != m_host.OwnerID)
3375 return; 3300 return;
3376 3301
3377 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3302 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3378 { 3303 DetachFromAvatar();
3379 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3380 if (attachmentsModule != null)
3381 Util.FireAndForget(DetachWrapper, m_host);
3382 }
3383 }
3384
3385 private void DetachWrapper(object o)
3386 {
3387 SceneObjectPart host = (SceneObjectPart)o;
3388
3389 SceneObjectGroup grp = host.ParentGroup;
3390 UUID itemID = grp.FromItemID;
3391 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3392
3393 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3394 if (attachmentsModule != null)
3395 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3396 } 3304 }
3397 3305
3398 public void llTakeCamera(string avatar) 3306 public void llTakeCamera(string avatar)
@@ -3513,7 +3421,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3513 } 3421 }
3514 3422
3515 emailModule.SendEmail(m_host.UUID, address, subject, message); 3423 emailModule.SendEmail(m_host.UUID, address, subject, message);
3516 ScriptSleep(15000); 3424 ScriptSleep(EMAIL_PAUSE_TIME * 1000);
3517 } 3425 }
3518 3426
3519 public void llGetNextEmail(string address, string subject) 3427 public void llGetNextEmail(string address, string subject)
@@ -3550,6 +3458,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3550 return m_host.UUID.ToString(); 3458 return m_host.UUID.ToString();
3551 } 3459 }
3552 3460
3461 public LSL_Key llGenerateKey()
3462 {
3463 m_host.AddScriptLPS(1);
3464 return UUID.Random().ToString();
3465 }
3466
3553 public void llSetBuoyancy(double buoyancy) 3467 public void llSetBuoyancy(double buoyancy)
3554 { 3468 {
3555 m_host.AddScriptLPS(1); 3469 m_host.AddScriptLPS(1);
@@ -3596,7 +3510,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3596 m_host.AddScriptLPS(1); 3510 m_host.AddScriptLPS(1);
3597 try 3511 try
3598 { 3512 {
3599 m_ScriptEngine.SetMinEventDelay(m_itemID, delay); 3513 m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay);
3600 } 3514 }
3601 catch (NotImplementedException) 3515 catch (NotImplementedException)
3602 { 3516 {
@@ -3649,29 +3563,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3649 { 3563 {
3650 m_host.AddScriptLPS(1); 3564 m_host.AddScriptLPS(1);
3651 3565
3652 UUID invItemID = InventorySelf(); 3566 if (m_item.PermsGranter == UUID.Zero)
3653 if (invItemID == UUID.Zero)
3654 return;
3655
3656 TaskInventoryItem item;
3657
3658 m_host.TaskInventory.LockItemsForRead(true);
3659 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3660 {
3661 m_host.TaskInventory.LockItemsForRead(false);
3662 return;
3663 }
3664 else
3665 {
3666 item = m_host.TaskInventory[InventorySelf()];
3667 }
3668 m_host.TaskInventory.LockItemsForRead(false);
3669 if (item.PermsGranter == UUID.Zero)
3670 return; 3567 return;
3671 3568
3672 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) 3569 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3673 { 3570 {
3674 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3571 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3675 3572
3676 if (presence != null) 3573 if (presence != null)
3677 { 3574 {
@@ -3689,41 +3586,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3689 { 3586 {
3690 m_host.AddScriptLPS(1); 3587 m_host.AddScriptLPS(1);
3691 3588
3692 UUID invItemID=InventorySelf(); 3589 if (m_item.PermsGranter == UUID.Zero)
3693 if (invItemID == UUID.Zero)
3694 return; 3590 return;
3695 3591
3696 TaskInventoryItem item; 3592 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3697
3698 m_host.TaskInventory.LockItemsForRead(true);
3699 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3700 { 3593 {
3701 m_host.TaskInventory.LockItemsForRead(false); 3594 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3702 return;
3703 }
3704 else
3705 {
3706 item = m_host.TaskInventory[InventorySelf()];
3707 }
3708 m_host.TaskInventory.LockItemsForRead(false);
3709
3710
3711 if (item.PermsGranter == UUID.Zero)
3712 return;
3713
3714 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3715 {
3716 UUID animID = new UUID();
3717
3718 if (!UUID.TryParse(anim, out animID))
3719 {
3720 animID=InventoryKey(anim);
3721 }
3722
3723 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3724 3595
3725 if (presence != null) 3596 if (presence != null)
3726 { 3597 {
3598 UUID animID = KeyOrName(anim);
3599
3727 if (animID == UUID.Zero) 3600 if (animID == UUID.Zero)
3728 presence.Animator.RemoveAnimation(anim); 3601 presence.Animator.RemoveAnimation(anim);
3729 else 3602 else
@@ -3756,44 +3629,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3756 public LSL_Integer llGetStartParameter() 3629 public LSL_Integer llGetStartParameter()
3757 { 3630 {
3758 m_host.AddScriptLPS(1); 3631 m_host.AddScriptLPS(1);
3759 return m_ScriptEngine.GetStartParameter(m_itemID); 3632 return m_ScriptEngine.GetStartParameter(m_item.ItemID);
3760 } 3633 }
3761 3634
3762 public void llRequestPermissions(string agent, int perm) 3635 public void llRequestPermissions(string agent, int perm)
3763 { 3636 {
3764 UUID agentID = new UUID(); 3637 UUID agentID;
3765 3638
3766 if (!UUID.TryParse(agent, out agentID)) 3639 if (!UUID.TryParse(agent, out agentID))
3767 return; 3640 return;
3768 3641
3769 UUID invItemID = InventorySelf();
3770
3771 if (invItemID == UUID.Zero)
3772 return; // Not in a prim? How??
3773
3774 TaskInventoryItem item;
3775
3776
3777 m_host.TaskInventory.LockItemsForRead(true);
3778 if (!m_host.TaskInventory.ContainsKey(invItemID))
3779 {
3780 m_host.TaskInventory.LockItemsForRead(false);
3781 return;
3782 }
3783 else
3784 {
3785 item = m_host.TaskInventory[invItemID];
3786 }
3787 m_host.TaskInventory.LockItemsForRead(false);
3788
3789 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3642 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3790 { 3643 {
3791 llReleaseControls(); 3644 llReleaseControls();
3792 3645
3793 item.PermsGranter = UUID.Zero; 3646 m_item.PermsGranter = UUID.Zero;
3794 item.PermsMask = 0; 3647 m_item.PermsMask = 0;
3795 3648
3796 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3649 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3797 "run_time_permissions", new Object[] { 3650 "run_time_permissions", new Object[] {
3798 new LSL_Integer(0) }, 3651 new LSL_Integer(0) },
3799 new DetectParams[0])); 3652 new DetectParams[0]));
@@ -3801,7 +3654,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3801 return; 3654 return;
3802 } 3655 }
3803 3656
3804 if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3657 if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3805 llReleaseControls(); 3658 llReleaseControls();
3806 3659
3807 m_host.AddScriptLPS(1); 3660 m_host.AddScriptLPS(1);
@@ -3818,11 +3671,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3818 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3671 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3819 { 3672 {
3820 m_host.TaskInventory.LockItemsForWrite(true); 3673 m_host.TaskInventory.LockItemsForWrite(true);
3821 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3674 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3822 m_host.TaskInventory[invItemID].PermsMask = perm; 3675 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3823 m_host.TaskInventory.LockItemsForWrite(false); 3676 m_host.TaskInventory.LockItemsForWrite(false);
3824 3677
3825 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3678 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3826 "run_time_permissions", new Object[] { 3679 "run_time_permissions", new Object[] {
3827 new LSL_Integer(perm) }, 3680 new LSL_Integer(perm) },
3828 new DetectParams[0])); 3681 new DetectParams[0]));
@@ -3857,11 +3710,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3857 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3710 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3858 { 3711 {
3859 m_host.TaskInventory.LockItemsForWrite(true); 3712 m_host.TaskInventory.LockItemsForWrite(true);
3860 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3713 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3861 m_host.TaskInventory[invItemID].PermsMask = perm; 3714 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3862 m_host.TaskInventory.LockItemsForWrite(false); 3715 m_host.TaskInventory.LockItemsForWrite(false);
3863 3716
3864 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3717 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3865 "run_time_permissions", new Object[] { 3718 "run_time_permissions", new Object[] {
3866 new LSL_Integer(perm) }, 3719 new LSL_Integer(perm) },
3867 new DetectParams[0])); 3720 new DetectParams[0]));
@@ -3872,9 +3725,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3872 } 3725 }
3873 3726
3874 ScenePresence presence = World.GetScenePresence(agentID); 3727 ScenePresence presence = World.GetScenePresence(agentID);
3875
3876 if (presence != null) 3728 if (presence != null)
3877 { 3729 {
3730 // If permissions are being requested from an NPC and were not implicitly granted above then
3731 // auto grant all reuqested permissions if the script is owned by the NPC or the NPCs owner
3732 INPCModule npcModule = World.RequestModuleInterface<INPCModule>();
3733 if (npcModule != null && npcModule.IsNPC(agentID, World))
3734 {
3735 if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID)
3736 {
3737 lock (m_host.TaskInventory)
3738 {
3739 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3740 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3741 }
3742
3743 m_ScriptEngine.PostScriptEvent(
3744 m_item.ItemID,
3745 new EventParams(
3746 "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0]));
3747 }
3748
3749 // it is an NPC, exit even if the permissions werent granted above, they are not going to answer
3750 // the question!
3751 return;
3752 }
3753
3878 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); 3754 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID);
3879 if (ownerName == String.Empty) 3755 if (ownerName == String.Empty)
3880 ownerName = "(hippos)"; 3756 ownerName = "(hippos)";
@@ -3882,8 +3758,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3882 if (!m_waitingForScriptAnswer) 3758 if (!m_waitingForScriptAnswer)
3883 { 3759 {
3884 m_host.TaskInventory.LockItemsForWrite(true); 3760 m_host.TaskInventory.LockItemsForWrite(true);
3885 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3761 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3886 m_host.TaskInventory[invItemID].PermsMask = 0; 3762 m_host.TaskInventory[m_item.ItemID].PermsMask = 0;
3887 m_host.TaskInventory.LockItemsForWrite(false); 3763 m_host.TaskInventory.LockItemsForWrite(false);
3888 3764
3889 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3765 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
@@ -3891,16 +3767,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3891 } 3767 }
3892 3768
3893 presence.ControllingClient.SendScriptQuestion( 3769 presence.ControllingClient.SendScriptQuestion(
3894 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); 3770 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm);
3895 3771
3896 return; 3772 return;
3897 } 3773 }
3898 3774
3899 // Requested agent is not in range, refuse perms 3775 // Requested agent is not in range, refuse perms
3900 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3776 m_ScriptEngine.PostScriptEvent(
3901 "run_time_permissions", new Object[] { 3777 m_item.ItemID,
3902 new LSL_Integer(0) }, 3778 new EventParams("run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0]));
3903 new DetectParams[0]));
3904 } 3779 }
3905 3780
3906 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) 3781 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer)
@@ -3908,24 +3783,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3908 if (taskID != m_host.UUID) 3783 if (taskID != m_host.UUID)
3909 return; 3784 return;
3910 3785
3911 UUID invItemID = InventorySelf(); 3786 client.OnScriptAnswer -= handleScriptAnswer;
3912 3787 m_waitingForScriptAnswer = false;
3913 if (invItemID == UUID.Zero)
3914 return;
3915
3916 client.OnScriptAnswer-=handleScriptAnswer;
3917 m_waitingForScriptAnswer=false;
3918 3788
3919 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3789 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3920 llReleaseControls(); 3790 llReleaseControls();
3921 3791
3922
3923 m_host.TaskInventory.LockItemsForWrite(true); 3792 m_host.TaskInventory.LockItemsForWrite(true);
3924 m_host.TaskInventory[invItemID].PermsMask = answer; 3793 m_host.TaskInventory[m_item.ItemID].PermsMask = answer;
3925 m_host.TaskInventory.LockItemsForWrite(false); 3794 m_host.TaskInventory.LockItemsForWrite(false);
3926 3795
3927 3796 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3928 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3929 "run_time_permissions", new Object[] { 3797 "run_time_permissions", new Object[] {
3930 new LSL_Integer(answer) }, 3798 new LSL_Integer(answer) },
3931 new DetectParams[0])); 3799 new DetectParams[0]));
@@ -3935,41 +3803,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3935 { 3803 {
3936 m_host.AddScriptLPS(1); 3804 m_host.AddScriptLPS(1);
3937 3805
3938 m_host.TaskInventory.LockItemsForRead(true); 3806 return m_item.PermsGranter.ToString();
3939
3940 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3941 {
3942 if (item.Type == 10 && item.ItemID == m_itemID)
3943 {
3944 m_host.TaskInventory.LockItemsForRead(false);
3945 return item.PermsGranter.ToString();
3946 }
3947 }
3948 m_host.TaskInventory.LockItemsForRead(false);
3949
3950 return UUID.Zero.ToString();
3951 } 3807 }
3952 3808
3953 public LSL_Integer llGetPermissions() 3809 public LSL_Integer llGetPermissions()
3954 { 3810 {
3955 m_host.AddScriptLPS(1); 3811 m_host.AddScriptLPS(1);
3956 3812
3957 m_host.TaskInventory.LockItemsForRead(true); 3813 int perms = m_item.PermsMask;
3958 3814
3959 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3815 if (m_automaticLinkPermission)
3960 { 3816 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3961 if (item.Type == 10 && item.ItemID == m_itemID)
3962 {
3963 int perms = item.PermsMask;
3964 if (m_automaticLinkPermission)
3965 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3966 m_host.TaskInventory.LockItemsForRead(false);
3967 return perms;
3968 }
3969 }
3970 m_host.TaskInventory.LockItemsForRead(false);
3971 3817
3972 return 0; 3818 return perms;
3973 } 3819 }
3974 3820
3975 public LSL_Integer llGetLinkNumber() 3821 public LSL_Integer llGetLinkNumber()
@@ -4007,18 +3853,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4007 public void llCreateLink(string target, int parent) 3853 public void llCreateLink(string target, int parent)
4008 { 3854 {
4009 m_host.AddScriptLPS(1); 3855 m_host.AddScriptLPS(1);
4010 UUID invItemID = InventorySelf(); 3856
4011 UUID targetID; 3857 UUID targetID;
4012 3858
4013 if (!UUID.TryParse(target, out targetID)) 3859 if (!UUID.TryParse(target, out targetID))
4014 return; 3860 return;
4015 3861
4016 TaskInventoryItem item; 3862 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4017 m_host.TaskInventory.LockItemsForRead(true);
4018 item = m_host.TaskInventory[invItemID];
4019 m_host.TaskInventory.LockItemsForRead(false);
4020
4021 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4022 && !m_automaticLinkPermission) 3863 && !m_automaticLinkPermission)
4023 { 3864 {
4024 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3865 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
@@ -4026,7 +3867,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4026 } 3867 }
4027 3868
4028 IClientAPI client = null; 3869 IClientAPI client = null;
4029 ScenePresence sp = World.GetScenePresence(item.PermsGranter); 3870 ScenePresence sp = World.GetScenePresence(m_item.PermsGranter);
4030 if (sp != null) 3871 if (sp != null)
4031 client = sp.ControllingClient; 3872 client = sp.ControllingClient;
4032 3873
@@ -4072,18 +3913,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4072 public void llBreakLink(int linknum) 3913 public void llBreakLink(int linknum)
4073 { 3914 {
4074 m_host.AddScriptLPS(1); 3915 m_host.AddScriptLPS(1);
4075 UUID invItemID = InventorySelf();
4076 3916
4077 m_host.TaskInventory.LockItemsForRead(true); 3917 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4078 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3918 && !m_automaticLinkPermission)
4079 && !m_automaticLinkPermission) 3919 {
4080 { 3920 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
4081 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3921 return;
4082 m_host.TaskInventory.LockItemsForRead(false); 3922 }
4083 return; 3923
4084 }
4085 m_host.TaskInventory.LockItemsForRead(false);
4086
4087 if (linknum < ScriptBaseClass.LINK_THIS) 3924 if (linknum < ScriptBaseClass.LINK_THIS)
4088 return; 3925 return;
4089 3926
@@ -4182,12 +4019,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4182 { 4019 {
4183 m_host.AddScriptLPS(1); 4020 m_host.AddScriptLPS(1);
4184 4021
4185 UUID invItemID = InventorySelf(); 4022 TaskInventoryItem item = m_item;
4186
4187 TaskInventoryItem item;
4188 m_host.TaskInventory.LockItemsForRead(true);
4189 item = m_host.TaskInventory[invItemID];
4190 m_host.TaskInventory.LockItemsForRead(false);
4191 4023
4192 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 4024 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4193 && !m_automaticLinkPermission) 4025 && !m_automaticLinkPermission)
@@ -4498,7 +4330,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4498 { 4330 {
4499 if (item.Name == name) 4331 if (item.Name == name)
4500 { 4332 {
4501 if (item.ItemID == m_itemID) 4333 if (item.ItemID == m_item.ItemID)
4502 throw new ScriptDeleteException(); 4334 throw new ScriptDeleteException();
4503 else 4335 else
4504 m_host.Inventory.RemoveInventoryItem(item.ItemID); 4336 m_host.Inventory.RemoveInventoryItem(item.ItemID);
@@ -4632,8 +4464,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4632 UUID rq = UUID.Random(); 4464 UUID rq = UUID.Random();
4633 4465
4634 UUID tid = AsyncCommands. 4466 UUID tid = AsyncCommands.
4635 DataserverPlugin.RegisterRequest(m_localID, 4467 DataserverPlugin.RegisterRequest(m_host.LocalId,
4636 m_itemID, rq.ToString()); 4468 m_item.ItemID, rq.ToString());
4637 4469
4638 AsyncCommands. 4470 AsyncCommands.
4639 DataserverPlugin.DataserverReply(rq.ToString(), reply); 4471 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -4660,8 +4492,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4660 if (item.Type == 3 && item.Name == name) 4492 if (item.Type == 3 && item.Name == name)
4661 { 4493 {
4662 UUID tid = AsyncCommands. 4494 UUID tid = AsyncCommands.
4663 DataserverPlugin.RegisterRequest(m_localID, 4495 DataserverPlugin.RegisterRequest(m_host.LocalId,
4664 m_itemID, item.AssetID.ToString()); 4496 m_item.ItemID, item.AssetID.ToString());
4665 4497
4666 Vector3 region = new Vector3( 4498 Vector3 region = new Vector3(
4667 World.RegionInfo.RegionLocX * Constants.RegionSize, 4499 World.RegionInfo.RegionLocX * Constants.RegionSize,
@@ -5070,22 +4902,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5070 4902
5071 public LSL_String llGetScriptName() 4903 public LSL_String llGetScriptName()
5072 { 4904 {
5073 string result = String.Empty;
5074
5075 m_host.AddScriptLPS(1); 4905 m_host.AddScriptLPS(1);
5076 4906
5077 m_host.TaskInventory.LockItemsForRead(true); 4907 return m_item.Name != null ? m_item.Name : String.Empty;
5078 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
5079 {
5080 if (item.Type == 10 && item.ItemID == m_itemID)
5081 {
5082 result = item.Name!=null?item.Name:String.Empty;
5083 break;
5084 }
5085 }
5086 m_host.TaskInventory.LockItemsForRead(false);
5087
5088 return result;
5089 } 4908 }
5090 4909
5091 public LSL_Integer llGetLinkNumberOfSides(int link) 4910 public LSL_Integer llGetLinkNumberOfSides(int link)
@@ -6370,7 +6189,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6370 if (m_host.OwnerID == land.LandData.OwnerID) 6189 if (m_host.OwnerID == land.LandData.OwnerID)
6371 { 6190 {
6372 Vector3 pos = World.GetNearestAllowedPosition(presence, land); 6191 Vector3 pos = World.GetNearestAllowedPosition(presence, land);
6373 presence.TeleportWithMomentum(pos); 6192 presence.TeleportWithMomentum(pos, null);
6374 presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); 6193 presence.ControllingClient.SendAlertMessage("You have been ejected from this land");
6375 } 6194 }
6376 } 6195 }
@@ -7317,14 +7136,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7317 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7136 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7318 if (xmlrpcMod.IsEnabled()) 7137 if (xmlrpcMod.IsEnabled())
7319 { 7138 {
7320 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); 7139 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero);
7321 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); 7140 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>();
7322 if (xmlRpcRouter != null) 7141 if (xmlRpcRouter != null)
7323 { 7142 {
7324 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; 7143 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName;
7325 7144
7326 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, 7145 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID,
7327 m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, 7146 m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName,
7328 xmlrpcMod.Port.ToString())); 7147 xmlrpcMod.Port.ToString()));
7329 } 7148 }
7330 object[] resobj = new object[] 7149 object[] resobj = new object[]
@@ -7336,7 +7155,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7336 new LSL_Integer(0), 7155 new LSL_Integer(0),
7337 new LSL_String(String.Empty) 7156 new LSL_String(String.Empty)
7338 }; 7157 };
7339 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, 7158 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj,
7340 new DetectParams[0])); 7159 new DetectParams[0]));
7341 } 7160 }
7342 ScriptSleep(1000); 7161 ScriptSleep(1000);
@@ -7347,7 +7166,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7347 m_host.AddScriptLPS(1); 7166 m_host.AddScriptLPS(1);
7348 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7167 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7349 ScriptSleep(3000); 7168 ScriptSleep(3000);
7350 return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); 7169 return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString();
7351 } 7170 }
7352 7171
7353 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) 7172 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata)
@@ -8186,7 +8005,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8186 return; 8005 return;
8187 face = (int)rules.GetLSLIntegerItem(idx++); 8006 face = (int)rules.GetLSLIntegerItem(idx++);
8188 int shiny = (int)rules.GetLSLIntegerItem(idx++); 8007 int shiny = (int)rules.GetLSLIntegerItem(idx++);
8189 Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); 8008 Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++);
8190 8009
8191 SetShiny(part, face, shiny, bump); 8010 SetShiny(part, face, shiny, bump);
8192 8011
@@ -9651,7 +9470,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9651 public LSL_String llGetSimulatorHostname() 9470 public LSL_String llGetSimulatorHostname()
9652 { 9471 {
9653 m_host.AddScriptLPS(1); 9472 m_host.AddScriptLPS(1);
9654 return System.Environment.MachineName; 9473 IUrlModule UrlModule = World.RequestModuleInterface<IUrlModule>();
9474 return UrlModule.ExternalHostNameForLSL;
9655 } 9475 }
9656 9476
9657 // <summary> 9477 // <summary>
@@ -9990,13 +9810,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9990 { 9810 {
9991 m_host.AddScriptLPS(1); 9811 m_host.AddScriptLPS(1);
9992 if (m_UrlModule != null) 9812 if (m_UrlModule != null)
9993 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 9813 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
9994 return UUID.Zero.ToString(); 9814 return UUID.Zero.ToString();
9995 } 9815 }
9996 9816
9997 public LSL_String llRequestSimulatorData(string simulator, int data) 9817 public LSL_String llRequestSimulatorData(string simulator, int data)
9998 { 9818 {
9999 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); 9819 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL");
10000 9820
10001 try 9821 try
10002 { 9822 {
@@ -10006,7 +9826,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10006 9826
10007 GridRegion info; 9827 GridRegion info;
10008 9828
10009 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) 9829 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) //Det data for this simulator?
9830
10010 info = new GridRegion(m_ScriptEngine.World.RegionInfo); 9831 info = new GridRegion(m_ScriptEngine.World.RegionInfo);
10011 else 9832 else
10012 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); 9833 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator);
@@ -10019,10 +9840,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10019 ScriptSleep(1000); 9840 ScriptSleep(1000);
10020 return UUID.Zero.ToString(); 9841 return UUID.Zero.ToString();
10021 } 9842 }
10022 reply = new LSL_Vector( 9843 if (m_ScriptEngine.World.RegionInfo.RegionName != simulator)
10023 info.RegionLocX, 9844 {
10024 info.RegionLocY, 9845 //Hypergrid Region co-ordinates
10025 0).ToString(); 9846 uint rx = 0, ry = 0;
9847 Utils.LongToUInts(Convert.ToUInt64(info.RegionSecret), out rx, out ry);
9848
9849 reply = new LSL_Vector(
9850 rx,
9851 ry,
9852 0).ToString();
9853 }
9854 else
9855 {
9856 //Local-cooridnates
9857 reply = new LSL_Vector(
9858 info.RegionLocX,
9859 info.RegionLocY,
9860 0).ToString();
9861 }
10026 break; 9862 break;
10027 case ScriptBaseClass.DATA_SIM_STATUS: 9863 case ScriptBaseClass.DATA_SIM_STATUS:
10028 if (info != null) 9864 if (info != null)
@@ -10058,7 +9894,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10058 UUID rq = UUID.Random(); 9894 UUID rq = UUID.Random();
10059 9895
10060 UUID tid = AsyncCommands. 9896 UUID tid = AsyncCommands.
10061 DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 9897 DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
10062 9898
10063 AsyncCommands. 9899 AsyncCommands.
10064 DataserverPlugin.DataserverReply(rq.ToString(), reply); 9900 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -10077,7 +9913,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10077 m_host.AddScriptLPS(1); 9913 m_host.AddScriptLPS(1);
10078 9914
10079 if (m_UrlModule != null) 9915 if (m_UrlModule != null)
10080 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 9916 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
10081 return UUID.Zero.ToString(); 9917 return UUID.Zero.ToString();
10082 } 9918 }
10083 9919
@@ -10113,7 +9949,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10113 // child agents have a mass of 1.0 9949 // child agents have a mass of 1.0
10114 return 1; 9950 return 1;
10115 else 9951 else
10116 return avatar.GetMass(); 9952 return (double)avatar.GetMass();
10117 } 9953 }
10118 catch (KeyNotFoundException) 9954 catch (KeyNotFoundException)
10119 { 9955 {
@@ -10556,32 +10392,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10556 public LSL_Vector llGetCameraPos() 10392 public LSL_Vector llGetCameraPos()
10557 { 10393 {
10558 m_host.AddScriptLPS(1); 10394 m_host.AddScriptLPS(1);
10559 UUID invItemID = InventorySelf();
10560
10561 if (invItemID == UUID.Zero)
10562 return new LSL_Vector();
10563
10564 m_host.TaskInventory.LockItemsForRead(true);
10565
10566 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter;
10567 10395
10568// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 10396 if (m_item.PermsGranter == UUID.Zero)
10569 if (agentID == UUID.Zero) 10397 return new LSL_Vector();
10570 {
10571 m_host.TaskInventory.LockItemsForRead(false);
10572 return new LSL_Vector();
10573 }
10574 10398
10575 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 10399 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10576 { 10400 {
10577 ShoutError("No permissions to track the camera"); 10401 ShoutError("No permissions to track the camera");
10578 m_host.TaskInventory.LockItemsForRead(false);
10579 return new LSL_Vector(); 10402 return new LSL_Vector();
10580 } 10403 }
10581 m_host.TaskInventory.LockItemsForRead(false); 10404 m_host.TaskInventory.LockItemsForRead(false);
10582 10405
10583// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10406// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
10584 ScenePresence presence = World.GetScenePresence(agentID); 10407 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
10585 if (presence != null) 10408 if (presence != null)
10586 { 10409 {
10587 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); 10410 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z);
@@ -10593,30 +10416,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10593 public LSL_Rotation llGetCameraRot() 10416 public LSL_Rotation llGetCameraRot()
10594 { 10417 {
10595 m_host.AddScriptLPS(1); 10418 m_host.AddScriptLPS(1);
10596 UUID invItemID = InventorySelf();
10597 if (invItemID == UUID.Zero)
10598 return new LSL_Rotation();
10599
10600 m_host.TaskInventory.LockItemsForRead(true);
10601 10419
10602 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter; 10420 if (m_item.PermsGranter == UUID.Zero)
10421 return new LSL_Rotation();
10603 10422
10604// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 10423 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10605 if (agentID == UUID.Zero)
10606 {
10607 m_host.TaskInventory.LockItemsForRead(false);
10608 return new LSL_Rotation();
10609 }
10610 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10611 { 10424 {
10612 ShoutError("No permissions to track the camera"); 10425 ShoutError("No permissions to track the camera");
10613 m_host.TaskInventory.LockItemsForRead(false);
10614 return new LSL_Rotation(); 10426 return new LSL_Rotation();
10615 } 10427 }
10616 m_host.TaskInventory.LockItemsForRead(false); 10428 m_host.TaskInventory.LockItemsForRead(false);
10617 10429
10618// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10430// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
10619 ScenePresence presence = World.GetScenePresence(agentID); 10431 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
10620 if (presence != null) 10432 if (presence != null)
10621 { 10433 {
10622 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); 10434 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W);
@@ -10675,7 +10487,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10675 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) 10487 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt)
10676 { 10488 {
10677 m_host.AddScriptLPS(1); 10489 m_host.AddScriptLPS(1);
10678 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); 10490 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0);
10679 if (detectedParams == null) 10491 if (detectedParams == null)
10680 { 10492 {
10681 if (m_host.ParentGroup.IsAttachment == true) 10493 if (m_host.ParentGroup.IsAttachment == true)
@@ -10799,30 +10611,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10799 { 10611 {
10800 m_host.AddScriptLPS(1); 10612 m_host.AddScriptLPS(1);
10801 10613
10802 // our key in the object we are in
10803 UUID invItemID = InventorySelf();
10804 if (invItemID == UUID.Zero) return;
10805
10806 // the object we are in 10614 // the object we are in
10807 UUID objectID = m_host.ParentUUID; 10615 UUID objectID = m_host.ParentUUID;
10808 if (objectID == UUID.Zero) return; 10616 if (objectID == UUID.Zero)
10617 return;
10809 10618
10810 UUID agentID;
10811 m_host.TaskInventory.LockItemsForRead(true);
10812 // we need the permission first, to know which avatar we want to set the camera for 10619 // we need the permission first, to know which avatar we want to set the camera for
10813 agentID = m_host.TaskInventory[invItemID].PermsGranter; 10620 UUID agentID = m_item.PermsGranter;
10814 10621
10815 if (agentID == UUID.Zero) 10622 if (agentID == UUID.Zero)
10816 {
10817 m_host.TaskInventory.LockItemsForRead(false);
10818 return; 10623 return;
10819 } 10624
10820 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 10625 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
10821 {
10822 m_host.TaskInventory.LockItemsForRead(false);
10823 return; 10626 return;
10824 }
10825 m_host.TaskInventory.LockItemsForRead(false);
10826 10627
10827 ScenePresence presence = World.GetScenePresence(agentID); 10628 ScenePresence presence = World.GetScenePresence(agentID);
10828 10629
@@ -10864,34 +10665,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10864 { 10665 {
10865 m_host.AddScriptLPS(1); 10666 m_host.AddScriptLPS(1);
10866 10667
10867 // our key in the object we are in
10868 UUID invItemID=InventorySelf();
10869 if (invItemID == UUID.Zero) return;
10870
10871 // the object we are in 10668 // the object we are in
10872 UUID objectID = m_host.ParentUUID; 10669 UUID objectID = m_host.ParentUUID;
10873 if (objectID == UUID.Zero) return; 10670 if (objectID == UUID.Zero)
10671 return;
10874 10672
10875 // we need the permission first, to know which avatar we want to clear the camera for 10673 // we need the permission first, to know which avatar we want to clear the camera for
10876 UUID agentID; 10674 UUID agentID = m_item.PermsGranter;
10877 m_host.TaskInventory.LockItemsForRead(true); 10675
10878 agentID = m_host.TaskInventory[invItemID].PermsGranter;
10879 if (agentID == UUID.Zero) 10676 if (agentID == UUID.Zero)
10880 {
10881 m_host.TaskInventory.LockItemsForRead(false);
10882 return; 10677 return;
10883 } 10678
10884 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 10679 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
10885 {
10886 m_host.TaskInventory.LockItemsForRead(false);
10887 return; 10680 return;
10888 }
10889 m_host.TaskInventory.LockItemsForRead(false);
10890 10681
10891 ScenePresence presence = World.GetScenePresence(agentID); 10682 ScenePresence presence = World.GetScenePresence(agentID);
10892 10683
10893 // we are not interested in child-agents 10684 // we are not interested in child-agents
10894 if (presence.IsChildAgent) return; 10685 if (presence.IsChildAgent)
10686 return;
10895 10687
10896 presence.ControllingClient.SendClearFollowCamProperties(objectID); 10688 presence.ControllingClient.SendClearFollowCamProperties(objectID);
10897 } 10689 }
@@ -11082,8 +10874,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11082 } 10874 }
11083 } 10875 }
11084 10876
11085 UUID reqID = httpScriptMod. 10877 UUID reqID
11086 StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); 10878 = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body);
11087 10879
11088 if (reqID != UUID.Zero) 10880 if (reqID != UUID.Zero)
11089 return reqID.ToString(); 10881 return reqID.ToString();
@@ -11315,19 +11107,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11315 break; 11107 break;
11316 // For the following 8 see the Object version below 11108 // For the following 8 see the Object version below
11317 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11109 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11318 ret.Add(new LSL_Integer(0)); 11110 ret.Add(new LSL_Integer(av.RunningScriptCount()));
11319 break; 11111 break;
11320 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11112 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11321 ret.Add(new LSL_Integer(0)); 11113 ret.Add(new LSL_Integer(av.ScriptCount()));
11322 break; 11114 break;
11323 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11115 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11324 ret.Add(new LSL_Integer(0)); 11116 ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384));
11325 break; 11117 break;
11326 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11118 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11327 ret.Add(new LSL_Float(0)); 11119 ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f));
11328 break; 11120 break;
11329 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11121 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11330 ret.Add(new LSL_Integer(0)); 11122 ret.Add(new LSL_Integer(1));
11331 break; 11123 break;
11332 case ScriptBaseClass.OBJECT_SERVER_COST: 11124 case ScriptBaseClass.OBJECT_SERVER_COST:
11333 ret.Add(new LSL_Float(0)); 11125 ret.Add(new LSL_Float(0));
@@ -11379,43 +11171,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11379 case ScriptBaseClass.OBJECT_CREATOR: 11171 case ScriptBaseClass.OBJECT_CREATOR:
11380 ret.Add(new LSL_String(obj.CreatorID.ToString())); 11172 ret.Add(new LSL_String(obj.CreatorID.ToString()));
11381 break; 11173 break;
11382 // The following 8 I have intentionaly coded to return zero. They are part of
11383 // "Land Impact" calculations. These calculations are probably not applicable
11384 // to OpenSim, required figures (cpu/memory usage) are not currently tracked
11385 // I have intentionally left these all at zero rather than return possibly
11386 // missleading numbers
11387 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11174 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
11388 // in SL this currently includes crashed scripts 11175 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount()));
11389 ret.Add(new LSL_Integer(0));
11390 break; 11176 break;
11391 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11177 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
11392 ret.Add(new LSL_Integer(0)); 11178 ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount()));
11393 break; 11179 break;
11394 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11180 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
11395 // The value returned in SL for mono scripts is 65536 * number of active scripts 11181 // The value returned in SL for mono scripts is 65536 * number of active scripts
11396 ret.Add(new LSL_Integer(0)); 11182 // and 16384 * number of active scripts for LSO. since llGetFreememory
11183 // is coded to give the LSO value use it here
11184 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384));
11397 break; 11185 break;
11398 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11186 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
11399 // Average cpu time per simulator frame expended on all scripts in the objetc 11187 // Average cpu time in seconds per simulator frame expended on all scripts in the object
11400 ret.Add(new LSL_Float(0)); 11188 ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f));
11401 break; 11189 break;
11402 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11190 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
11403 // according to the SL wiki A prim or linkset will have prim 11191 // according to the SL wiki A prim or linkset will have prim
11404 // equivalent of the number of prims in a linkset if it does not 11192 // equivalent of the number of prims in a linkset if it does not
11405 // contain a mesh anywhere in the link set or is not a normal prim 11193 // contain a mesh anywhere in the link set or is not a normal prim
11406 // The value returned in SL for normal prims is prim count 11194 // The value returned in SL for normal prims is prim count
11407 ret.Add(new LSL_Integer(0)); 11195 ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount));
11408 break; 11196 break;
11197 // The following 3 costs I have intentionaly coded to return zero. They are part of
11198 // "Land Impact" calculations. These calculations are probably not applicable
11199 // to OpenSim and are not yet complete in SL
11409 case ScriptBaseClass.OBJECT_SERVER_COST: 11200 case ScriptBaseClass.OBJECT_SERVER_COST:
11410 // The value returned in SL for normal prims is prim count 11201 // The linden calculation is here
11202 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight
11203 // The value returned in SL for normal prims looks like the prim count
11411 ret.Add(new LSL_Float(0)); 11204 ret.Add(new LSL_Float(0));
11412 break; 11205 break;
11413 case ScriptBaseClass.OBJECT_STREAMING_COST: 11206 case ScriptBaseClass.OBJECT_STREAMING_COST:
11414 // The value returned in SL for normal prims is prim count * 0.06 11207 // The linden calculation is here
11208 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Streaming_Cost
11209 // The value returned in SL for normal prims looks like the prim count * 0.06
11415 ret.Add(new LSL_Float(0)); 11210 ret.Add(new LSL_Float(0));
11416 break; 11211 break;
11417 case ScriptBaseClass.OBJECT_PHYSICS_COST: 11212 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11418 // The value returned in SL for normal prims is prim count 11213 // The linden calculation is here
11214 // http://wiki.secondlife.com/wiki/Mesh/Mesh_physics
11215 // The value returned in SL for normal prims looks like the prim count
11419 ret.Add(new LSL_Float(0)); 11216 ret.Add(new LSL_Float(0));
11420 break; 11217 break;
11421 default: 11218 default:
@@ -11513,7 +11310,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11513 } 11310 }
11514 11311
11515 // was: UUID tid = tid = AsyncCommands. 11312 // was: UUID tid = tid = AsyncCommands.
11516 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11313 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
11517 11314
11518 if (NotecardCache.IsCached(assetID)) 11315 if (NotecardCache.IsCached(assetID))
11519 { 11316 {
@@ -11576,7 +11373,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11576 } 11373 }
11577 11374
11578 // was: UUID tid = tid = AsyncCommands. 11375 // was: UUID tid = tid = AsyncCommands.
11579 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11376 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
11580 11377
11581 if (NotecardCache.IsCached(assetID)) 11378 if (NotecardCache.IsCached(assetID))
11582 { 11379 {
@@ -11660,7 +11457,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11660 { 11457 {
11661 UUID rq = UUID.Random(); 11458 UUID rq = UUID.Random();
11662 11459
11663 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 11460 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
11664 11461
11665 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); 11462 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id)));
11666 11463
@@ -11676,7 +11473,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11676 { 11473 {
11677 UUID rq = UUID.Random(); 11474 UUID rq = UUID.Random();
11678 11475
11679 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 11476 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
11680 11477
11681 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); 11478 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id));
11682 11479
@@ -12170,7 +11967,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12170 bool isAccount = false; 11967 bool isAccount = false;
12171 bool isGroup = false; 11968 bool isGroup = false;
12172 11969
12173 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) 11970 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID))
12174 return 0; 11971 return 0;
12175 11972
12176 UUID id = new UUID(); 11973 UUID id = new UUID();
@@ -12232,35 +12029,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12232 return 1; 12029 return 1;
12233 } 12030 }
12234 12031
12235 #region Not Implemented 12032 public LSL_Integer llGetMemoryLimit()
12236 // 12033 {
12237 // Listing the unimplemented lsl functions here, please move 12034 m_host.AddScriptLPS(1);
12238 // them from this region as they are completed 12035 // The value returned for LSO scripts in SL
12239 // 12036 return 16384;
12037 }
12240 12038
12241 public void llGetEnv(LSL_String name) 12039 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
12242 { 12040 {
12243 m_host.AddScriptLPS(1); 12041 m_host.AddScriptLPS(1);
12244 NotImplemented("llGetEnv"); 12042 // Treat as an LSO script
12043 return ScriptBaseClass.FALSE;
12245 } 12044 }
12246 12045
12247 public void llGetSPMaxMemory() 12046 public LSL_Integer llGetSPMaxMemory()
12248 { 12047 {
12249 m_host.AddScriptLPS(1); 12048 m_host.AddScriptLPS(1);
12250 NotImplemented("llGetSPMaxMemory"); 12049 // The value returned for LSO scripts in SL
12050 return 16384;
12251 } 12051 }
12252 12052
12253 public virtual LSL_Integer llGetUsedMemory() 12053 public virtual LSL_Integer llGetUsedMemory()
12254 { 12054 {
12255 m_host.AddScriptLPS(1); 12055 m_host.AddScriptLPS(1);
12256 NotImplemented("llGetUsedMemory"); 12056 // The value returned for LSO scripts in SL
12257 return 0; 12057 return 16384;
12258 } 12058 }
12259 12059
12260 public void llScriptProfiler(LSL_Integer flags) 12060 public void llScriptProfiler(LSL_Integer flags)
12261 { 12061 {
12262 m_host.AddScriptLPS(1); 12062 m_host.AddScriptLPS(1);
12263 //NotImplemented("llScriptProfiler"); 12063 // This does nothing for LSO scripts in SL
12064 }
12065
12066 #region Not Implemented
12067 //
12068 // Listing the unimplemented lsl functions here, please move
12069 // them from this region as they are completed
12070 //
12071
12072 public void llGetEnv(LSL_String name)
12073 {
12074 m_host.AddScriptLPS(1);
12075 NotImplemented("llGetEnv");
12264 } 12076 }
12265 12077
12266 public void llSetSoundQueueing(int queue) 12078 public void llSetSoundQueueing(int queue)
@@ -12340,8 +12152,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12340 12152
12341 try 12153 try
12342 { 12154 {
12343 UUID invItemID=InventorySelf(); 12155 TaskInventoryItem item = m_item;
12344 if (invItemID == UUID.Zero) 12156 if (item == null)
12345 { 12157 {
12346 replydata = "SERVICE_ERROR"; 12158 replydata = "SERVICE_ERROR";
12347 return; 12159 return;
@@ -12349,10 +12161,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12349 12161
12350 m_host.AddScriptLPS(1); 12162 m_host.AddScriptLPS(1);
12351 12163
12352 m_host.TaskInventory.LockItemsForRead(true);
12353 TaskInventoryItem item = m_host.TaskInventory[invItemID];
12354 m_host.TaskInventory.LockItemsForRead(false);
12355
12356 if (item.PermsGranter == UUID.Zero) 12164 if (item.PermsGranter == UUID.Zero)
12357 { 12165 {
12358 replydata = "MISSING_PERMISSION_DEBIT"; 12166 replydata = "MISSING_PERMISSION_DEBIT";
@@ -12394,7 +12202,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12394 } 12202 }
12395 finally 12203 finally
12396 { 12204 {
12397 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 12205 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
12398 "transaction_result", new Object[] { 12206 "transaction_result", new Object[] {
12399 new LSL_String(txn.ToString()), 12207 new LSL_String(txn.ToString()),
12400 new LSL_Integer(replycode), 12208 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;