aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs1412
1 files changed, 555 insertions, 857 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 595dd8a..6ec3081 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -88,8 +88,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 88 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
89 protected IScriptEngine m_ScriptEngine; 89 protected IScriptEngine m_ScriptEngine;
90 protected SceneObjectPart m_host; 90 protected SceneObjectPart m_host;
91 protected uint m_localID; 91
92 protected UUID m_itemID; 92 /// <summary>
93 /// The item that hosts this script
94 /// </summary>
95 protected TaskInventoryItem m_item;
96
93 protected bool throwErrorOnNotImplemented = true; 97 protected bool throwErrorOnNotImplemented = true;
94 protected AsyncCommandManager AsyncCommands = null; 98 protected AsyncCommandManager AsyncCommands = null;
95 protected float m_ScriptDelayFactor = 1.0f; 99 protected float m_ScriptDelayFactor = 1.0f;
@@ -107,6 +111,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
107 protected IUrlModule m_UrlModule = null; 111 protected IUrlModule m_UrlModule = null;
108 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache = 112 protected Dictionary<UUID, UserInfoCacheEntry> m_userInfoCache =
109 new Dictionary<UUID, UserInfoCacheEntry>(); 113 new Dictionary<UUID, UserInfoCacheEntry>();
114 protected int EMAIL_PAUSE_TIME = 20; // documented delay value for smtp.
110 115
111// protected Timer m_ShoutSayTimer; 116// protected Timer m_ShoutSayTimer;
112 protected int m_SayShoutCount = 0; 117 protected int m_SayShoutCount = 0;
@@ -134,7 +139,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
134 {"TURNRIGHT", "Turning Right"} 139 {"TURNRIGHT", "Turning Right"}
135 }; 140 };
136 141
137 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) 142 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item)
138 { 143 {
139/* 144/*
140 m_ShoutSayTimer = new Timer(1000); 145 m_ShoutSayTimer = new Timer(1000);
@@ -146,10 +151,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
146 151
147 m_ScriptEngine = ScriptEngine; 152 m_ScriptEngine = ScriptEngine;
148 m_host = host; 153 m_host = host;
149 m_localID = localID; 154 m_item = item;
150 m_itemID = itemID;
151 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 155 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
152 156
157 LoadLimits(); // read script limits from config.
158
159 m_TransferModule =
160 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>();
161 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
162
163 AsyncCommands = new AsyncCommandManager(ScriptEngine);
164 }
165
166 /* load configuration items that affect script, object and run-time behavior. */
167 private void LoadLimits()
168 {
153 m_ScriptDelayFactor = 169 m_ScriptDelayFactor =
154 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); 170 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f);
155 m_ScriptDistanceFactor = 171 m_ScriptDistanceFactor =
@@ -162,12 +178,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
162 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); 178 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255);
163 if (m_notecardLineReadCharsMax > 65535) 179 if (m_notecardLineReadCharsMax > 65535)
164 m_notecardLineReadCharsMax = 65535; 180 m_notecardLineReadCharsMax = 65535;
165 181 // load limits for particular subsystems.
166 m_TransferModule = 182 IConfig SMTPConfig;
167 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); 183 if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) {
168 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); 184 // there's an smtp config, so load in the snooze time.
169 185 EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME);
170 AsyncCommands = new AsyncCommandManager(ScriptEngine); 186 }
171 } 187 }
172 188
173 public override Object InitializeLifetimeService() 189 public override Object InitializeLifetimeService()
@@ -199,7 +215,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
199 [DebuggerNonUserCode] 215 [DebuggerNonUserCode]
200 public void state(string newState) 216 public void state(string newState)
201 { 217 {
202 m_ScriptEngine.SetState(m_itemID, newState); 218 m_ScriptEngine.SetState(m_item.ItemID, newState);
203 } 219 }
204 220
205 /// <summary> 221 /// <summary>
@@ -210,7 +226,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
210 public void llResetScript() 226 public void llResetScript()
211 { 227 {
212 m_host.AddScriptLPS(1); 228 m_host.AddScriptLPS(1);
213 m_ScriptEngine.ApiResetScript(m_itemID); 229 m_ScriptEngine.ApiResetScript(m_item.ItemID);
214 } 230 }
215 231
216 public void llResetOtherScript(string name) 232 public void llResetOtherScript(string name)
@@ -219,7 +235,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
219 235
220 m_host.AddScriptLPS(1); 236 m_host.AddScriptLPS(1);
221 237
222 if ((item = ScriptByName(name)) != UUID.Zero) 238 if ((item = GetScriptByName(name)) != UUID.Zero)
223 m_ScriptEngine.ResetScript(item); 239 m_ScriptEngine.ResetScript(item);
224 else 240 else
225 ShoutError("llResetOtherScript: script "+name+" not found"); 241 ShoutError("llResetOtherScript: script "+name+" not found");
@@ -231,7 +247,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
231 247
232 m_host.AddScriptLPS(1); 248 m_host.AddScriptLPS(1);
233 249
234 if ((item = ScriptByName(name)) != UUID.Zero) 250 if ((item = GetScriptByName(name)) != UUID.Zero)
235 { 251 {
236 return m_ScriptEngine.GetScriptState(item) ?1:0; 252 return m_ScriptEngine.GetScriptState(item) ?1:0;
237 } 253 }
@@ -253,7 +269,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
253 // These functions are supposed to be robust, 269 // These functions are supposed to be robust,
254 // so get the state one step at a time. 270 // so get the state one step at a time.
255 271
256 if ((item = ScriptByName(name)) != UUID.Zero) 272 if ((item = GetScriptByName(name)) != UUID.Zero)
257 { 273 {
258 m_ScriptEngine.SetScriptState(item, run == 0 ? false : true); 274 m_ScriptEngine.SetScriptState(item, run == 0 ? false : true);
259 } 275 }
@@ -362,77 +378,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
362 } 378 }
363 } 379 }
364 380
365 protected UUID InventorySelf()
366 {
367 UUID invItemID = new UUID();
368 bool unlock = false;
369 if (!m_host.TaskInventory.IsReadLockedByMe())
370 {
371 m_host.TaskInventory.LockItemsForRead(true);
372 unlock = true;
373 }
374 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
375 {
376 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
377 {
378 invItemID = inv.Key;
379 break;
380 }
381 }
382 if (unlock)
383 {
384 m_host.TaskInventory.LockItemsForRead(false);
385 }
386 return invItemID;
387 }
388
389 protected UUID InventoryKey(string name, int type) 381 protected UUID InventoryKey(string name, int type)
390 { 382 {
391 m_host.AddScriptLPS(1); 383 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
392 m_host.TaskInventory.LockItemsForRead(true);
393
394 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
395 {
396 if (inv.Value.Name == name)
397 {
398 m_host.TaskInventory.LockItemsForRead(false);
399
400 if (inv.Value.Type != type)
401 {
402 return UUID.Zero;
403 }
404
405 return inv.Value.AssetID;
406 }
407 }
408
409 m_host.TaskInventory.LockItemsForRead(false);
410 return UUID.Zero;
411 }
412
413 protected UUID InventoryKey(string name)
414 {
415 m_host.AddScriptLPS(1);
416
417
418 m_host.TaskInventory.LockItemsForRead(true);
419 384
420 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 385 if (item != null && item.Type == type)
421 { 386 return item.AssetID;
422 if (inv.Value.Name == name) 387 else
423 { 388 return UUID.Zero;
424 m_host.TaskInventory.LockItemsForRead(false);
425 return inv.Value.AssetID;
426 }
427 }
428
429 m_host.TaskInventory.LockItemsForRead(false);
430
431
432 return UUID.Zero;
433 } 389 }
434 390
435
436 /// <summary> 391 /// <summary>
437 /// accepts a valid UUID, -or- a name of an inventory item. 392 /// accepts a valid UUID, -or- a name of an inventory item.
438 /// Returns a valid UUID or UUID.Zero if key invalid and item not found 393 /// Returns a valid UUID or UUID.Zero if key invalid and item not found
@@ -442,19 +397,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
442 /// <returns></returns> 397 /// <returns></returns>
443 protected UUID KeyOrName(string k) 398 protected UUID KeyOrName(string k)
444 { 399 {
445 UUID key = UUID.Zero; 400 UUID key;
446 401
447 // if we can parse the string as a key, use it. 402 // if we can parse the string as a key, use it.
448 if (UUID.TryParse(k, out key))
449 {
450 return key;
451 }
452 // else try to locate the name in inventory of object. found returns key, 403 // else try to locate the name in inventory of object. found returns key,
453 // not found returns UUID.Zero which will translate to the default particle texture 404 // not found returns UUID.Zero
454 else 405 if (!UUID.TryParse(k, out key))
455 { 406 {
456 return InventoryKey(k); 407 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
408
409 if (item != null)
410 key = item.AssetID;
411 else
412 key = UUID.Zero;
457 } 413 }
414
415 return key;
458 } 416 }
459 417
460 // convert a LSL_Rotation to a Quaternion 418 // convert a LSL_Rotation to a Quaternion
@@ -559,15 +517,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
559 return LSL_Vector.Norm(v); 517 return LSL_Vector.Norm(v);
560 } 518 }
561 519
562 public LSL_Float llVecDist(LSL_Vector a, LSL_Vector b) 520 private double VecDist(LSL_Vector a, LSL_Vector b)
563 { 521 {
564 m_host.AddScriptLPS(1);
565 double dx = a.x - b.x; 522 double dx = a.x - b.x;
566 double dy = a.y - b.y; 523 double dy = a.y - b.y;
567 double dz = a.z - b.z; 524 double dz = a.z - b.z;
568 return Math.Sqrt(dx * dx + dy * dy + dz * dz); 525 return Math.Sqrt(dx * dx + dy * dy + dz * dz);
569 } 526 }
570 527
528 public LSL_Float llVecDist(LSL_Vector a, LSL_Vector b)
529 {
530 m_host.AddScriptLPS(1);
531 return VecDist(a, b);
532 }
533
571 //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke 534 //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke
572 535
573 // Utility function for llRot2Euler 536 // Utility function for llRot2Euler
@@ -1010,7 +973,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1010 UUID.TryParse(ID, out keyID); 973 UUID.TryParse(ID, out keyID);
1011 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 974 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
1012 if (wComm != null) 975 if (wComm != null)
1013 return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); 976 return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg);
1014 else 977 else
1015 return -1; 978 return -1;
1016 } 979 }
@@ -1020,7 +983,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1020 m_host.AddScriptLPS(1); 983 m_host.AddScriptLPS(1);
1021 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 984 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
1022 if (wComm != null) 985 if (wComm != null)
1023 wComm.ListenControl(m_itemID, number, active); 986 wComm.ListenControl(m_item.ItemID, number, active);
1024 } 987 }
1025 988
1026 public void llListenRemove(int number) 989 public void llListenRemove(int number)
@@ -1028,7 +991,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1028 m_host.AddScriptLPS(1); 991 m_host.AddScriptLPS(1);
1029 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 992 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
1030 if (wComm != null) 993 if (wComm != null)
1031 wComm.ListenRemove(m_itemID, number); 994 wComm.ListenRemove(m_item.ItemID, number);
1032 } 995 }
1033 996
1034 public void llSensor(string name, string id, int type, double range, double arc) 997 public void llSensor(string name, string id, int type, double range, double arc)
@@ -1037,7 +1000,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1037 UUID keyID = UUID.Zero; 1000 UUID keyID = UUID.Zero;
1038 UUID.TryParse(id, out keyID); 1001 UUID.TryParse(id, out keyID);
1039 1002
1040 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); 1003 AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host);
1041 } 1004 }
1042 1005
1043 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) 1006 public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate)
@@ -1046,13 +1009,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1046 UUID keyID = UUID.Zero; 1009 UUID keyID = UUID.Zero;
1047 UUID.TryParse(id, out keyID); 1010 UUID.TryParse(id, out keyID);
1048 1011
1049 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); 1012 AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host);
1050 } 1013 }
1051 1014
1052 public void llSensorRemove() 1015 public void llSensorRemove()
1053 { 1016 {
1054 m_host.AddScriptLPS(1); 1017 m_host.AddScriptLPS(1);
1055 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); 1018 AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID);
1056 } 1019 }
1057 1020
1058 public string resolveName(UUID objecUUID) 1021 public string resolveName(UUID objecUUID)
@@ -1093,7 +1056,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1093 public LSL_String llDetectedName(int number) 1056 public LSL_String llDetectedName(int number)
1094 { 1057 {
1095 m_host.AddScriptLPS(1); 1058 m_host.AddScriptLPS(1);
1096 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1059 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1097 if (detectedParams == null) 1060 if (detectedParams == null)
1098 return String.Empty; 1061 return String.Empty;
1099 return detectedParams.Name; 1062 return detectedParams.Name;
@@ -1102,7 +1065,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1102 public LSL_String llDetectedKey(int number) 1065 public LSL_String llDetectedKey(int number)
1103 { 1066 {
1104 m_host.AddScriptLPS(1); 1067 m_host.AddScriptLPS(1);
1105 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1068 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1106 if (detectedParams == null) 1069 if (detectedParams == null)
1107 return String.Empty; 1070 return String.Empty;
1108 return detectedParams.Key.ToString(); 1071 return detectedParams.Key.ToString();
@@ -1111,7 +1074,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1111 public LSL_String llDetectedOwner(int number) 1074 public LSL_String llDetectedOwner(int number)
1112 { 1075 {
1113 m_host.AddScriptLPS(1); 1076 m_host.AddScriptLPS(1);
1114 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1077 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1115 if (detectedParams == null) 1078 if (detectedParams == null)
1116 return String.Empty; 1079 return String.Empty;
1117 return detectedParams.Owner.ToString(); 1080 return detectedParams.Owner.ToString();
@@ -1120,7 +1083,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1120 public LSL_Integer llDetectedType(int number) 1083 public LSL_Integer llDetectedType(int number)
1121 { 1084 {
1122 m_host.AddScriptLPS(1); 1085 m_host.AddScriptLPS(1);
1123 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1086 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1124 if (detectedParams == null) 1087 if (detectedParams == null)
1125 return 0; 1088 return 0;
1126 return new LSL_Integer(detectedParams.Type); 1089 return new LSL_Integer(detectedParams.Type);
@@ -1129,7 +1092,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1129 public LSL_Vector llDetectedPos(int number) 1092 public LSL_Vector llDetectedPos(int number)
1130 { 1093 {
1131 m_host.AddScriptLPS(1); 1094 m_host.AddScriptLPS(1);
1132 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1095 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1133 if (detectedParams == null) 1096 if (detectedParams == null)
1134 return new LSL_Vector(); 1097 return new LSL_Vector();
1135 return detectedParams.Position; 1098 return detectedParams.Position;
@@ -1138,7 +1101,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1138 public LSL_Vector llDetectedVel(int number) 1101 public LSL_Vector llDetectedVel(int number)
1139 { 1102 {
1140 m_host.AddScriptLPS(1); 1103 m_host.AddScriptLPS(1);
1141 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1104 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1142 if (detectedParams == null) 1105 if (detectedParams == null)
1143 return new LSL_Vector(); 1106 return new LSL_Vector();
1144 return detectedParams.Velocity; 1107 return detectedParams.Velocity;
@@ -1147,7 +1110,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1147 public LSL_Vector llDetectedGrab(int number) 1110 public LSL_Vector llDetectedGrab(int number)
1148 { 1111 {
1149 m_host.AddScriptLPS(1); 1112 m_host.AddScriptLPS(1);
1150 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1113 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1151 if (parms == null) 1114 if (parms == null)
1152 return new LSL_Vector(0, 0, 0); 1115 return new LSL_Vector(0, 0, 0);
1153 1116
@@ -1157,7 +1120,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1157 public LSL_Rotation llDetectedRot(int number) 1120 public LSL_Rotation llDetectedRot(int number)
1158 { 1121 {
1159 m_host.AddScriptLPS(1); 1122 m_host.AddScriptLPS(1);
1160 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1123 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1161 if (detectedParams == null) 1124 if (detectedParams == null)
1162 return new LSL_Rotation(); 1125 return new LSL_Rotation();
1163 return detectedParams.Rotation; 1126 return detectedParams.Rotation;
@@ -1166,7 +1129,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1166 public LSL_Integer llDetectedGroup(int number) 1129 public LSL_Integer llDetectedGroup(int number)
1167 { 1130 {
1168 m_host.AddScriptLPS(1); 1131 m_host.AddScriptLPS(1);
1169 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); 1132 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1170 if (detectedParams == null) 1133 if (detectedParams == null)
1171 return new LSL_Integer(0); 1134 return new LSL_Integer(0);
1172 if (m_host.GroupID == detectedParams.Group) 1135 if (m_host.GroupID == detectedParams.Group)
@@ -1177,7 +1140,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1177 public LSL_Integer llDetectedLinkNumber(int number) 1140 public LSL_Integer llDetectedLinkNumber(int number)
1178 { 1141 {
1179 m_host.AddScriptLPS(1); 1142 m_host.AddScriptLPS(1);
1180 DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); 1143 DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number);
1181 if (parms == null) 1144 if (parms == null)
1182 return new LSL_Integer(0); 1145 return new LSL_Integer(0);
1183 1146
@@ -1190,7 +1153,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1190 public LSL_Vector llDetectedTouchBinormal(int index) 1153 public LSL_Vector llDetectedTouchBinormal(int index)
1191 { 1154 {
1192 m_host.AddScriptLPS(1); 1155 m_host.AddScriptLPS(1);
1193 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1156 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1194 if (detectedParams == null) 1157 if (detectedParams == null)
1195 return new LSL_Vector(); 1158 return new LSL_Vector();
1196 return detectedParams.TouchBinormal; 1159 return detectedParams.TouchBinormal;
@@ -1202,7 +1165,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1202 public LSL_Integer llDetectedTouchFace(int index) 1165 public LSL_Integer llDetectedTouchFace(int index)
1203 { 1166 {
1204 m_host.AddScriptLPS(1); 1167 m_host.AddScriptLPS(1);
1205 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1168 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1206 if (detectedParams == null) 1169 if (detectedParams == null)
1207 return new LSL_Integer(-1); 1170 return new LSL_Integer(-1);
1208 return new LSL_Integer(detectedParams.TouchFace); 1171 return new LSL_Integer(detectedParams.TouchFace);
@@ -1214,7 +1177,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1214 public LSL_Vector llDetectedTouchNormal(int index) 1177 public LSL_Vector llDetectedTouchNormal(int index)
1215 { 1178 {
1216 m_host.AddScriptLPS(1); 1179 m_host.AddScriptLPS(1);
1217 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1180 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1218 if (detectedParams == null) 1181 if (detectedParams == null)
1219 return new LSL_Vector(); 1182 return new LSL_Vector();
1220 return detectedParams.TouchNormal; 1183 return detectedParams.TouchNormal;
@@ -1226,7 +1189,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1226 public LSL_Vector llDetectedTouchPos(int index) 1189 public LSL_Vector llDetectedTouchPos(int index)
1227 { 1190 {
1228 m_host.AddScriptLPS(1); 1191 m_host.AddScriptLPS(1);
1229 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1192 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1230 if (detectedParams == null) 1193 if (detectedParams == null)
1231 return new LSL_Vector(); 1194 return new LSL_Vector();
1232 return detectedParams.TouchPos; 1195 return detectedParams.TouchPos;
@@ -1238,7 +1201,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1238 public LSL_Vector llDetectedTouchST(int index) 1201 public LSL_Vector llDetectedTouchST(int index)
1239 { 1202 {
1240 m_host.AddScriptLPS(1); 1203 m_host.AddScriptLPS(1);
1241 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1204 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1242 if (detectedParams == null) 1205 if (detectedParams == null)
1243 return new LSL_Vector(-1.0, -1.0, 0.0); 1206 return new LSL_Vector(-1.0, -1.0, 0.0);
1244 return detectedParams.TouchST; 1207 return detectedParams.TouchST;
@@ -1250,7 +1213,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1250 public LSL_Vector llDetectedTouchUV(int index) 1213 public LSL_Vector llDetectedTouchUV(int index)
1251 { 1214 {
1252 m_host.AddScriptLPS(1); 1215 m_host.AddScriptLPS(1);
1253 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); 1216 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index);
1254 if (detectedParams == null) 1217 if (detectedParams == null)
1255 return new LSL_Vector(-1.0, -1.0, 0.0); 1218 return new LSL_Vector(-1.0, -1.0, 0.0);
1256 return detectedParams.TouchUV; 1219 return detectedParams.TouchUV;
@@ -1433,6 +1396,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1433 } 1396 }
1434 } 1397 }
1435 1398
1399 private bool IsPhysical()
1400 {
1401 return ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) == (uint)PrimFlags.Physics);
1402 }
1403
1436 public LSL_Integer llGetStatus(int status) 1404 public LSL_Integer llGetStatus(int status)
1437 { 1405 {
1438 m_host.AddScriptLPS(1); 1406 m_host.AddScriptLPS(1);
@@ -1440,11 +1408,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1440 switch (status) 1408 switch (status)
1441 { 1409 {
1442 case ScriptBaseClass.STATUS_PHYSICS: 1410 case ScriptBaseClass.STATUS_PHYSICS:
1443 if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Physics) == (uint)PrimFlags.Physics) 1411 return IsPhysical() ? 1 : 0;
1444 {
1445 return 1;
1446 }
1447 return 0;
1448 1412
1449 case ScriptBaseClass.STATUS_PHANTOM: 1413 case ScriptBaseClass.STATUS_PHANTOM:
1450 if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) == (uint)PrimFlags.Phantom) 1414 if ((m_host.GetEffectiveObjectFlags() & (uint)PrimFlags.Phantom) == (uint)PrimFlags.Phantom)
@@ -1962,6 +1926,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1962 rgb.x = texcolor.R; 1926 rgb.x = texcolor.R;
1963 rgb.y = texcolor.G; 1927 rgb.y = texcolor.G;
1964 rgb.z = texcolor.B; 1928 rgb.z = texcolor.B;
1929
1965 return rgb; 1930 return rgb;
1966 } 1931 }
1967 else 1932 else
@@ -2196,11 +2161,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2196 { 2161 {
2197 m_host.AddScriptLPS(1); 2162 m_host.AddScriptLPS(1);
2198 2163
2199 SetPos(m_host, pos); 2164 SetPos(m_host, pos, true);
2200 2165
2201 ScriptSleep(200); 2166 ScriptSleep(200);
2202 } 2167 }
2203 2168
2169 /// <summary>
2170 /// Tries to move the entire object so that the root prim is within 0.1m of position. http://wiki.secondlife.com/wiki/LlSetRegionPos
2171 /// Documentation indicates that the use of x/y coordinates up to 10 meters outside the bounds of a region will work but do not specify what happens if there is no adjacent region for the object to move into.
2172 /// Uses the RegionSize constant here rather than hard-coding 266.0 to alert any developer modifying OpenSim to support variable-sized regions that this method will need tweaking.
2173 /// </summary>
2174 /// <param name="pos"></param>
2175 /// <returns>1 if successful, 0 otherwise.</returns>
2176 public LSL_Integer llSetRegionPos(LSL_Vector pos)
2177 {
2178 m_host.AddScriptLPS(1);
2179
2180 // BEGIN WORKAROUND
2181 // IF YOU GET REGION CROSSINGS WORKING WITH THIS FUNCTION, REPLACE THE WORKAROUND.
2182 //
2183 // This workaround is to prevent silent failure of this function.
2184 // According to the specification on the SL Wiki, providing a position outside of the
2185 if (pos.x < 0 || pos.x > Constants.RegionSize || pos.y < 0 || pos.y > Constants.RegionSize)
2186 {
2187 return 0;
2188 }
2189 // END WORK AROUND
2190 else if ( // this is not part of the workaround if-block because it's not related to the workaround.
2191 IsPhysical() ||
2192 m_host.ParentGroup.IsAttachment || // return FALSE if attachment
2193 (
2194 pos.x < -10.0 || // return FALSE if more than 10 meters into a west-adjacent region.
2195 pos.x > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a east-adjacent region.
2196 pos.y < -10.0 || // return FALSE if more than 10 meters into a south-adjacent region.
2197 pos.y > (Constants.RegionSize + 10) || // return FALSE if more than 10 meters into a north-adjacent region.
2198 pos.z > 4096 // return FALSE if altitude than 4096m
2199 )
2200 )
2201 {
2202 return 0;
2203 }
2204
2205 // if we reach this point, then the object is not physical, it's not an attachment, and the destination is within the valid range.
2206 // this could possibly be done in the above else-if block, but we're doing the check here to keep the code easier to read.
2207
2208 Vector3 objectPos = m_host.ParentGroup.RootPart.AbsolutePosition;
2209 LandData here = World.GetLandData((float)objectPos.X, (float)objectPos.Y);
2210 LandData there = World.GetLandData((float)pos.x, (float)pos.y);
2211
2212 // we're only checking prim limits if it's moving to a different parcel under the assumption that if the object got onto the parcel without exceeding the prim limits.
2213
2214 bool sameParcel = here.GlobalID == there.GlobalID;
2215
2216 if (!sameParcel && !World.Permissions.CanObjectEntry(m_host.UUID, false, new Vector3((float)pos.x, (float)pos.y, (float)pos.z)))
2217 {
2218 return 0;
2219 }
2220
2221 SetPos(m_host.ParentGroup.RootPart, pos, false);
2222
2223 return VecDist(pos, llGetRootPosition()) <= 0.1 ? 1 : 0;
2224 }
2225
2204 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) 2226 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos)
2205 // note linked setpos is capped "differently" 2227 // note linked setpos is capped "differently"
2206 private LSL_Vector SetPosAdjust(LSL_Vector start, LSL_Vector end) 2228 private LSL_Vector SetPosAdjust(LSL_Vector start, LSL_Vector end)
@@ -2232,55 +2254,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2232 return real_vec; 2254 return real_vec;
2233 } 2255 }
2234 2256
2235 public LSL_Integer llSetRegionPos(LSL_Vector pos) 2257 /// <summary>
2236 { 2258 /// set object position, optionally capping the distance.
2237 return new LSL_Integer(SetRegionPos(m_host, pos)); 2259 /// </summary>
2238 } 2260 /// <param name="part"></param>
2239 2261 /// <param name="targetPos"></param>
2240 protected int SetRegionPos(SceneObjectPart part, LSL_Vector targetPos) 2262 /// <param name="adjust">if TRUE, will cap the distance to 10m.</param>
2241 { 2263 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos, bool adjust)
2242 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2243 return 0;
2244
2245 SceneObjectGroup grp = part.ParentGroup;
2246
2247 if (grp.IsAttachment)
2248 return 0;
2249
2250 if (grp.RootPart.PhysActor != null && grp.RootPart.PhysActor.IsPhysical)
2251 return 0;
2252
2253 if (targetPos.x < -10.0f || targetPos.x >= (float)Constants.RegionSize || targetPos.y < -10.0f || targetPos.y >= (float)Constants.RegionSize || targetPos.z < 0 || targetPos.z >= 4096.0f)
2254 return 0;
2255
2256 float constrainedX = (float)targetPos.x;
2257 float constrainedY = (float)targetPos.y;
2258
2259 if (constrainedX < 0.0f)
2260 constrainedX = 0.0f;
2261 if (constrainedY < 0.0f)
2262 constrainedY = 0.0f;
2263 if (constrainedX >= (float)Constants.RegionSize)
2264 constrainedX = (float)Constants.RegionSize - 0.1f;
2265 if (constrainedY >= (float)Constants.RegionSize)
2266 constrainedY = (float)Constants.RegionSize -0.1f;
2267
2268 float ground = World.GetGroundHeight(constrainedX, constrainedY);
2269
2270 if (targetPos.z < ground)
2271 targetPos.z = ground;
2272
2273 Vector3 dest = new Vector3((float)targetPos.x, (float)targetPos.y, (float)targetPos.z);
2274
2275 if (!World.Permissions.CanObjectEntry(grp.UUID, false, dest))
2276 return 0;
2277
2278 grp.UpdateGroupPosition(dest);
2279
2280 return 1;
2281 }
2282
2283 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos)
2284 { 2264 {
2285 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 2265 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2286 return; 2266 return;
@@ -3044,20 +3024,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3044 3024
3045 public LSL_Integer llGiveMoney(string destination, int amount) 3025 public LSL_Integer llGiveMoney(string destination, int amount)
3046 { 3026 {
3047 UUID invItemID=InventorySelf();
3048 if (invItemID == UUID.Zero)
3049 return 0;
3050
3051 m_host.AddScriptLPS(1); 3027 m_host.AddScriptLPS(1);
3052 3028
3053 m_host.TaskInventory.LockItemsForRead(true); 3029 if (m_item.PermsGranter == UUID.Zero)
3054 TaskInventoryItem item = m_host.TaskInventory[invItemID];
3055 m_host.TaskInventory.LockItemsForRead(false);
3056
3057 if (item.PermsGranter == UUID.Zero)
3058 return 0; 3030 return 0;
3059 3031
3060 if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) 3032 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0)
3061 { 3033 {
3062 LSLError("No permissions to give money"); 3034 LSLError("No permissions to give money");
3063 return 0; 3035 return 0;
@@ -3120,74 +3092,72 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3120 { 3092 {
3121 m_host.AddScriptLPS(1); 3093 m_host.AddScriptLPS(1);
3122 3094
3123 Util.FireAndForget(delegate (object x) 3095 Util.FireAndForget(x =>
3124 { 3096 {
3125 if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s)) 3097 if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s))
3126 return; 3098 return;
3099
3127 float dist = (float)llVecDist(llGetPos(), pos); 3100 float dist = (float)llVecDist(llGetPos(), pos);
3128 3101
3129 if (dist > m_ScriptDistanceFactor * 10.0f) 3102 if (dist > m_ScriptDistanceFactor * 10.0f)
3130 return; 3103 return;
3131 3104
3132 //Clone is thread-safe 3105 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory);
3133 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
3134 3106
3135 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory) 3107 if (item == null)
3136 { 3108 {
3137 if (inv.Value.Name == inventory) 3109 llSay(0, "Could not find object " + inventory);
3138 { 3110 return;
3139 // make sure we're an object. 3111 }
3140 if (inv.Value.InvType != (int)InventoryType.Object)
3141 {
3142 llSay(0, "Unable to create requested object. Object is missing from database.");
3143 return;
3144 }
3145 3112
3146 Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); 3113 if (item.InvType != (int)InventoryType.Object)
3147 Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z); 3114 {
3115 llSay(0, "Unable to create requested object. Object is missing from database.");
3116 return;
3117 }
3148 3118
3149 // need the magnitude later 3119 Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z);
3150 // float velmag = (float)Util.GetMagnitude(llvel); 3120 Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z);
3151 3121
3152 SceneObjectGroup new_group = World.RezObject(m_host, inv.Value, llpos, Rot2Quaternion(rot), llvel, param); 3122 // need the magnitude later
3123 // float velmag = (float)Util.GetMagnitude(llvel);
3153 3124
3154 // If either of these are null, then there was an unknown error. 3125 SceneObjectGroup new_group = World.RezObject(m_host, item, llpos, Rot2Quaternion(rot), llvel, param);
3155 if (new_group == null)
3156 continue;
3157 3126
3158 // objects rezzed with this method are die_at_edge by default. 3127 // If either of these are null, then there was an unknown error.
3159 new_group.RootPart.SetDieAtEdge(true); 3128 if (new_group == null)
3129 return;
3160 3130
3161 new_group.ResumeScripts(); 3131 // objects rezzed with this method are die_at_edge by default.
3132 new_group.RootPart.SetDieAtEdge(true);
3162 3133
3163 m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( 3134 new_group.ResumeScripts();
3164 "object_rez", new Object[] {
3165 new LSL_String(
3166 new_group.RootPart.UUID.ToString()) },
3167 new DetectParams[0]));
3168 3135
3169 // do recoil 3136 m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams(
3170 SceneObjectGroup hostgrp = m_host.ParentGroup; 3137 "object_rez", new Object[] {
3171 if (hostgrp == null) 3138 new LSL_String(
3172 return; 3139 new_group.RootPart.UUID.ToString()) },
3140 new DetectParams[0]));
3141
3142 // do recoil
3143 SceneObjectGroup hostgrp = m_host.ParentGroup;
3144 if (hostgrp == null)
3145 return;
3173 3146
3174 if (hostgrp.IsAttachment) // don't recoil avatars 3147 if (hostgrp.IsAttachment) // don't recoil avatars
3175 return; 3148 return;
3176 3149
3177 PhysicsActor pa = new_group.RootPart.PhysActor; 3150 PhysicsActor pa = new_group.RootPart.PhysActor;
3178 3151
3179 if (pa != null && pa.IsPhysical && llvel != Vector3.Zero) 3152 if (pa != null && pa.IsPhysical && llvel != Vector3.Zero)
3180 { 3153 {
3181 float groupmass = new_group.GetMass(); 3154 float groupmass = new_group.GetMass();
3182 llvel *= -groupmass; 3155 llvel *= -groupmass;
3183 llApplyImpulse(new LSL_Vector(llvel.X, llvel.Y,llvel.Z), 0); 3156 llApplyImpulse(new LSL_Vector(llvel.X, llvel.Y,llvel.Z), 0);
3184 }
3185 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
3186 return;
3187 }
3188 } 3157 }
3158 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
3159 return;
3189 3160
3190 llSay(0, "Could not find object " + inventory);
3191 }); 3161 });
3192 3162
3193 //ScriptSleep((int)((groupmass * velmag) / 10)); 3163 //ScriptSleep((int)((groupmass * velmag) / 10));
@@ -3251,11 +3221,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3251 sec = m_MinTimerInterval; 3221 sec = m_MinTimerInterval;
3252 m_host.AddScriptLPS(1); 3222 m_host.AddScriptLPS(1);
3253 // Setting timer repeat 3223 // Setting timer repeat
3254 AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); 3224 AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec);
3255 } 3225 }
3256 3226
3257 public virtual void llSleep(double sec) 3227 public virtual void llSleep(double sec)
3258 { 3228 {
3229// m_log.Info("llSleep snoozing " + sec + "s.");
3259 m_host.AddScriptLPS(1); 3230 m_host.AddScriptLPS(1);
3260 Thread.Sleep((int)(sec * 1000)); 3231 Thread.Sleep((int)(sec * 1000));
3261 } 3232 }
@@ -3314,29 +3285,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3314 3285
3315 public void llTakeControls(int controls, int accept, int pass_on) 3286 public void llTakeControls(int controls, int accept, int pass_on)
3316 { 3287 {
3317 TaskInventoryItem item; 3288 if (m_item.PermsGranter != UUID.Zero)
3318
3319 m_host.TaskInventory.LockItemsForRead(true);
3320 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3321 { 3289 {
3322 m_host.TaskInventory.LockItemsForRead(false); 3290 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3323 return;
3324 }
3325 else
3326 {
3327 item = m_host.TaskInventory[InventorySelf()];
3328 }
3329 m_host.TaskInventory.LockItemsForRead(false);
3330
3331 if (item.PermsGranter != UUID.Zero)
3332 {
3333 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3334 3291
3335 if (presence != null) 3292 if (presence != null)
3336 { 3293 {
3337 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3294 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3338 { 3295 {
3339 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); 3296 presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID);
3340 } 3297 }
3341 } 3298 }
3342 } 3299 }
@@ -3346,38 +3303,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3346 3303
3347 public void llReleaseControls() 3304 public void llReleaseControls()
3348 { 3305 {
3349 TaskInventoryItem item;
3350
3351 m_host.TaskInventory.LockItemsForRead(true);
3352 lock (m_host.TaskInventory)
3353 {
3354
3355 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3356 {
3357 m_host.TaskInventory.LockItemsForRead(false);
3358 return;
3359 }
3360 else
3361 {
3362 item = m_host.TaskInventory[InventorySelf()];
3363 }
3364 }
3365 m_host.TaskInventory.LockItemsForRead(false);
3366
3367 m_host.AddScriptLPS(1); 3306 m_host.AddScriptLPS(1);
3368 3307
3369 if (item.PermsGranter != UUID.Zero) 3308 if (m_item.PermsGranter != UUID.Zero)
3370 { 3309 {
3371 ScenePresence presence = World.GetScenePresence(item.PermsGranter); 3310 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3372 3311
3373 if (presence != null) 3312 if (presence != null)
3374 { 3313 {
3375 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 3314 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
3376 { 3315 {
3377 // Unregister controls from Presence 3316 // Unregister controls from Presence
3378 presence.UnRegisterControlEventsToScript(m_localID, m_itemID); 3317 presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
3379 // Remove Take Control permission. 3318 // Remove Take Control permission.
3380 item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; 3319 m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
3381 } 3320 }
3382 } 3321 }
3383 } 3322 }
@@ -3390,86 +3329,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3390 m_UrlModule.ReleaseURL(url); 3329 m_UrlModule.ReleaseURL(url);
3391 } 3330 }
3392 3331
3393 public void llAttachToAvatar(int attachment) 3332 /// <summary>
3333 /// Attach the object containing this script to the avatar that owns it.
3334 /// </summary>
3335 /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param>
3336 /// <returns>true if the attach suceeded, false if it did not</returns>
3337 public bool AttachToAvatar(int attachmentPoint)
3394 { 3338 {
3395 m_host.AddScriptLPS(1); 3339 SceneObjectGroup grp = m_host.ParentGroup;
3396 3340 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
3397 TaskInventoryItem item;
3398 3341
3399 m_host.TaskInventory.LockItemsForRead(true); 3342 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3400 3343
3401 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3344 if (attachmentsModule != null)
3402 { 3345 return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false, true);
3403 m_host.TaskInventory.LockItemsForRead(false);
3404 return;
3405 }
3406 else 3346 else
3407 { 3347 return false;
3408 item = m_host.TaskInventory[InventorySelf()]; 3348 }
3409 }
3410
3411 m_host.TaskInventory.LockItemsForRead(false);
3412 3349
3413 if (item.PermsGranter != m_host.OwnerID) 3350 /// <summary>
3414 return; 3351 /// Detach the object containing this script from the avatar it is attached to.
3352 /// </summary>
3353 /// <remarks>
3354 /// Nothing happens if the object is not attached.
3355 /// </remarks>
3356 public void DetachFromAvatar()
3357 {
3358 Util.FireAndForget(DetachWrapper, m_host);
3359 }
3415 3360
3416 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3361 private void DetachWrapper(object o)
3362 {
3363 if (World.AttachmentsModule != null)
3417 { 3364 {
3418 SceneObjectGroup grp = m_host.ParentGroup; 3365 SceneObjectPart host = (SceneObjectPart)o;
3419 3366 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3420 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 3367 World.AttachmentsModule.DetachSingleAttachmentToInv(presence, host.ParentGroup);
3421
3422 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3423 if (attachmentsModule != null)
3424 attachmentsModule.AttachObject(presence, grp, (uint)attachment, false, true);
3425 } 3368 }
3426 } 3369 }
3427 3370
3428 public void llDetachFromAvatar() 3371 public void llAttachToAvatar(int attachmentPoint)
3429 { 3372 {
3430 m_host.AddScriptLPS(1); 3373 m_host.AddScriptLPS(1);
3431 3374
3432 if (m_host.ParentGroup.AttachmentPoint == 0) 3375 if (m_item.PermsGranter != m_host.OwnerID)
3433 return; 3376 return;
3434 3377
3435 TaskInventoryItem item; 3378 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3379 AttachToAvatar(attachmentPoint);
3380 }
3436 3381
3437 m_host.TaskInventory.LockItemsForRead(true); 3382 public void llDetachFromAvatar()
3383 {
3384 m_host.AddScriptLPS(1);
3438 3385
3439 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3386 if (m_host.ParentGroup.AttachmentPoint == 0)
3440 {
3441 m_host.TaskInventory.LockItemsForRead(false);
3442 return; 3387 return;
3443 }
3444 else
3445 {
3446 item = m_host.TaskInventory[InventorySelf()];
3447 }
3448 m_host.TaskInventory.LockItemsForRead(false);
3449 3388
3450 3389 if (m_item.PermsGranter != m_host.OwnerID)
3451 if (item.PermsGranter != m_host.OwnerID)
3452 return; 3390 return;
3453 3391
3454 if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) 3392 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0)
3455 { 3393 DetachFromAvatar();
3456 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3457 if (attachmentsModule != null)
3458 Util.FireAndForget(DetachWrapper, m_host);
3459 }
3460 }
3461
3462 private void DetachWrapper(object o)
3463 {
3464 SceneObjectPart host = (SceneObjectPart)o;
3465
3466 SceneObjectGroup grp = host.ParentGroup;
3467 UUID itemID = grp.FromItemID;
3468 ScenePresence presence = World.GetScenePresence(host.OwnerID);
3469
3470 IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule;
3471 if (attachmentsModule != null)
3472 attachmentsModule.DetachSingleAttachmentToInv(presence, itemID);
3473 } 3394 }
3474 3395
3475 public void llTakeCamera(string avatar) 3396 public void llTakeCamera(string avatar)
@@ -3590,7 +3511,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3590 } 3511 }
3591 3512
3592 emailModule.SendEmail(m_host.UUID, address, subject, message); 3513 emailModule.SendEmail(m_host.UUID, address, subject, message);
3593 ScriptSleep(15000); 3514 ScriptSleep(EMAIL_PAUSE_TIME * 1000);
3594 } 3515 }
3595 3516
3596 public void llGetNextEmail(string address, string subject) 3517 public void llGetNextEmail(string address, string subject)
@@ -3627,6 +3548,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3627 return m_host.UUID.ToString(); 3548 return m_host.UUID.ToString();
3628 } 3549 }
3629 3550
3551 public LSL_Key llGenerateKey()
3552 {
3553 m_host.AddScriptLPS(1);
3554 return UUID.Random().ToString();
3555 }
3556
3630 public void llSetBuoyancy(double buoyancy) 3557 public void llSetBuoyancy(double buoyancy)
3631 { 3558 {
3632 m_host.AddScriptLPS(1); 3559 m_host.AddScriptLPS(1);
@@ -3673,7 +3600,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3673 m_host.AddScriptLPS(1); 3600 m_host.AddScriptLPS(1);
3674 try 3601 try
3675 { 3602 {
3676 m_ScriptEngine.SetMinEventDelay(m_itemID, delay); 3603 m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay);
3677 } 3604 }
3678 catch (NotImplementedException) 3605 catch (NotImplementedException)
3679 { 3606 {
@@ -3726,29 +3653,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3726 { 3653 {
3727 m_host.AddScriptLPS(1); 3654 m_host.AddScriptLPS(1);
3728 3655
3729 UUID invItemID = InventorySelf(); 3656 if (m_item.PermsGranter == UUID.Zero)
3730 if (invItemID == UUID.Zero)
3731 return; 3657 return;
3732 3658
3733 TaskInventoryItem item; 3659 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3734
3735 m_host.TaskInventory.LockItemsForRead(true);
3736 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3737 { 3660 {
3738 m_host.TaskInventory.LockItemsForRead(false); 3661 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3739 return;
3740 }
3741 else
3742 {
3743 item = m_host.TaskInventory[InventorySelf()];
3744 }
3745 m_host.TaskInventory.LockItemsForRead(false);
3746 if (item.PermsGranter == UUID.Zero)
3747 return;
3748
3749 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3750 {
3751 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3752 3662
3753 if (presence != null) 3663 if (presence != null)
3754 { 3664 {
@@ -3766,41 +3676,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3766 { 3676 {
3767 m_host.AddScriptLPS(1); 3677 m_host.AddScriptLPS(1);
3768 3678
3769 UUID invItemID=InventorySelf(); 3679 if (m_item.PermsGranter == UUID.Zero)
3770 if (invItemID == UUID.Zero)
3771 return;
3772
3773 TaskInventoryItem item;
3774
3775 m_host.TaskInventory.LockItemsForRead(true);
3776 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3777 {
3778 m_host.TaskInventory.LockItemsForRead(false);
3779 return;
3780 }
3781 else
3782 {
3783 item = m_host.TaskInventory[InventorySelf()];
3784 }
3785 m_host.TaskInventory.LockItemsForRead(false);
3786
3787
3788 if (item.PermsGranter == UUID.Zero)
3789 return; 3680 return;
3790 3681
3791 if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) 3682 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3792 { 3683 {
3793 UUID animID = new UUID(); 3684 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3794
3795 if (!UUID.TryParse(anim, out animID))
3796 {
3797 animID=InventoryKey(anim);
3798 }
3799
3800 ScenePresence presence = World.GetScenePresence(item.PermsGranter);
3801 3685
3802 if (presence != null) 3686 if (presence != null)
3803 { 3687 {
3688 UUID animID = KeyOrName(anim);
3689
3804 if (animID == UUID.Zero) 3690 if (animID == UUID.Zero)
3805 presence.Animator.RemoveAnimation(anim); 3691 presence.Animator.RemoveAnimation(anim);
3806 else 3692 else
@@ -3833,44 +3719,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3833 public LSL_Integer llGetStartParameter() 3719 public LSL_Integer llGetStartParameter()
3834 { 3720 {
3835 m_host.AddScriptLPS(1); 3721 m_host.AddScriptLPS(1);
3836 return m_ScriptEngine.GetStartParameter(m_itemID); 3722 return m_ScriptEngine.GetStartParameter(m_item.ItemID);
3837 } 3723 }
3838 3724
3839 public void llRequestPermissions(string agent, int perm) 3725 public void llRequestPermissions(string agent, int perm)
3840 { 3726 {
3841 UUID agentID = new UUID(); 3727 UUID agentID;
3842 3728
3843 if (!UUID.TryParse(agent, out agentID)) 3729 if (!UUID.TryParse(agent, out agentID))
3844 return; 3730 return;
3845 3731
3846 UUID invItemID = InventorySelf();
3847
3848 if (invItemID == UUID.Zero)
3849 return; // Not in a prim? How??
3850
3851 TaskInventoryItem item;
3852
3853
3854 m_host.TaskInventory.LockItemsForRead(true);
3855 if (!m_host.TaskInventory.ContainsKey(invItemID))
3856 {
3857 m_host.TaskInventory.LockItemsForRead(false);
3858 return;
3859 }
3860 else
3861 {
3862 item = m_host.TaskInventory[invItemID];
3863 }
3864 m_host.TaskInventory.LockItemsForRead(false);
3865
3866 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3732 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3867 { 3733 {
3868 llReleaseControls(); 3734 llReleaseControls();
3869 3735
3870 item.PermsGranter = UUID.Zero; 3736 m_item.PermsGranter = UUID.Zero;
3871 item.PermsMask = 0; 3737 m_item.PermsMask = 0;
3872 3738
3873 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3739 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3874 "run_time_permissions", new Object[] { 3740 "run_time_permissions", new Object[] {
3875 new LSL_Integer(0) }, 3741 new LSL_Integer(0) },
3876 new DetectParams[0])); 3742 new DetectParams[0]));
@@ -3878,7 +3744,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3878 return; 3744 return;
3879 } 3745 }
3880 3746
3881 if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3747 if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3882 llReleaseControls(); 3748 llReleaseControls();
3883 3749
3884 m_host.AddScriptLPS(1); 3750 m_host.AddScriptLPS(1);
@@ -3895,11 +3761,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3895 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3761 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3896 { 3762 {
3897 m_host.TaskInventory.LockItemsForWrite(true); 3763 m_host.TaskInventory.LockItemsForWrite(true);
3898 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3764 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3899 m_host.TaskInventory[invItemID].PermsMask = perm; 3765 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3900 m_host.TaskInventory.LockItemsForWrite(false); 3766 m_host.TaskInventory.LockItemsForWrite(false);
3901 3767
3902 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3768 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3903 "run_time_permissions", new Object[] { 3769 "run_time_permissions", new Object[] {
3904 new LSL_Integer(perm) }, 3770 new LSL_Integer(perm) },
3905 new DetectParams[0])); 3771 new DetectParams[0]));
@@ -3934,11 +3800,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3934 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3800 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3935 { 3801 {
3936 m_host.TaskInventory.LockItemsForWrite(true); 3802 m_host.TaskInventory.LockItemsForWrite(true);
3937 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3803 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3938 m_host.TaskInventory[invItemID].PermsMask = perm; 3804 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3939 m_host.TaskInventory.LockItemsForWrite(false); 3805 m_host.TaskInventory.LockItemsForWrite(false);
3940 3806
3941 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3807 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
3942 "run_time_permissions", new Object[] { 3808 "run_time_permissions", new Object[] {
3943 new LSL_Integer(perm) }, 3809 new LSL_Integer(perm) },
3944 new DetectParams[0])); 3810 new DetectParams[0]));
@@ -3949,9 +3815,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3949 } 3815 }
3950 3816
3951 ScenePresence presence = World.GetScenePresence(agentID); 3817 ScenePresence presence = World.GetScenePresence(agentID);
3952
3953 if (presence != null) 3818 if (presence != null)
3954 { 3819 {
3820 // If permissions are being requested from an NPC and were not implicitly granted above then
3821 // auto grant all reuqested permissions if the script is owned by the NPC or the NPCs owner
3822 INPCModule npcModule = World.RequestModuleInterface<INPCModule>();
3823 if (npcModule != null && npcModule.IsNPC(agentID, World))
3824 {
3825 if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID)
3826 {
3827 lock (m_host.TaskInventory)
3828 {
3829 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3830 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3831 }
3832
3833 m_ScriptEngine.PostScriptEvent(
3834 m_item.ItemID,
3835 new EventParams(
3836 "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0]));
3837 }
3838
3839 // it is an NPC, exit even if the permissions werent granted above, they are not going to answer
3840 // the question!
3841 return;
3842 }
3843
3955 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); 3844 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID);
3956 if (ownerName == String.Empty) 3845 if (ownerName == String.Empty)
3957 ownerName = "(hippos)"; 3846 ownerName = "(hippos)";
@@ -3959,8 +3848,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3959 if (!m_waitingForScriptAnswer) 3848 if (!m_waitingForScriptAnswer)
3960 { 3849 {
3961 m_host.TaskInventory.LockItemsForWrite(true); 3850 m_host.TaskInventory.LockItemsForWrite(true);
3962 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3851 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3963 m_host.TaskInventory[invItemID].PermsMask = 0; 3852 m_host.TaskInventory[m_item.ItemID].PermsMask = 0;
3964 m_host.TaskInventory.LockItemsForWrite(false); 3853 m_host.TaskInventory.LockItemsForWrite(false);
3965 3854
3966 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3855 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
@@ -3968,16 +3857,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3968 } 3857 }
3969 3858
3970 presence.ControllingClient.SendScriptQuestion( 3859 presence.ControllingClient.SendScriptQuestion(
3971 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); 3860 m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm);
3972 3861
3973 return; 3862 return;
3974 } 3863 }
3975 3864
3976 // Requested agent is not in range, refuse perms 3865 // Requested agent is not in range, refuse perms
3977 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3866 m_ScriptEngine.PostScriptEvent(
3978 "run_time_permissions", new Object[] { 3867 m_item.ItemID,
3979 new LSL_Integer(0) }, 3868 new EventParams("run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0]));
3980 new DetectParams[0]));
3981 } 3869 }
3982 3870
3983 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) 3871 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer)
@@ -3985,24 +3873,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3985 if (taskID != m_host.UUID) 3873 if (taskID != m_host.UUID)
3986 return; 3874 return;
3987 3875
3988 UUID invItemID = InventorySelf(); 3876 client.OnScriptAnswer -= handleScriptAnswer;
3989 3877 m_waitingForScriptAnswer = false;
3990 if (invItemID == UUID.Zero)
3991 return;
3992
3993 client.OnScriptAnswer-=handleScriptAnswer;
3994 m_waitingForScriptAnswer=false;
3995 3878
3996 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3879 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3997 llReleaseControls(); 3880 llReleaseControls();
3998 3881
3999
4000 m_host.TaskInventory.LockItemsForWrite(true); 3882 m_host.TaskInventory.LockItemsForWrite(true);
4001 m_host.TaskInventory[invItemID].PermsMask = answer; 3883 m_host.TaskInventory[m_item.ItemID].PermsMask = answer;
4002 m_host.TaskInventory.LockItemsForWrite(false); 3884 m_host.TaskInventory.LockItemsForWrite(false);
4003 3885
4004 3886 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
4005 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
4006 "run_time_permissions", new Object[] { 3887 "run_time_permissions", new Object[] {
4007 new LSL_Integer(answer) }, 3888 new LSL_Integer(answer) },
4008 new DetectParams[0])); 3889 new DetectParams[0]));
@@ -4012,41 +3893,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4012 { 3893 {
4013 m_host.AddScriptLPS(1); 3894 m_host.AddScriptLPS(1);
4014 3895
4015 m_host.TaskInventory.LockItemsForRead(true); 3896 return m_item.PermsGranter.ToString();
4016
4017 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
4018 {
4019 if (item.Type == 10 && item.ItemID == m_itemID)
4020 {
4021 m_host.TaskInventory.LockItemsForRead(false);
4022 return item.PermsGranter.ToString();
4023 }
4024 }
4025 m_host.TaskInventory.LockItemsForRead(false);
4026
4027 return UUID.Zero.ToString();
4028 } 3897 }
4029 3898
4030 public LSL_Integer llGetPermissions() 3899 public LSL_Integer llGetPermissions()
4031 { 3900 {
4032 m_host.AddScriptLPS(1); 3901 m_host.AddScriptLPS(1);
4033 3902
4034 m_host.TaskInventory.LockItemsForRead(true); 3903 int perms = m_item.PermsMask;
4035 3904
4036 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3905 if (m_automaticLinkPermission)
4037 { 3906 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
4038 if (item.Type == 10 && item.ItemID == m_itemID)
4039 {
4040 int perms = item.PermsMask;
4041 if (m_automaticLinkPermission)
4042 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
4043 m_host.TaskInventory.LockItemsForRead(false);
4044 return perms;
4045 }
4046 }
4047 m_host.TaskInventory.LockItemsForRead(false);
4048 3907
4049 return 0; 3908 return perms;
4050 } 3909 }
4051 3910
4052 public LSL_Integer llGetLinkNumber() 3911 public LSL_Integer llGetLinkNumber()
@@ -4084,18 +3943,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4084 public void llCreateLink(string target, int parent) 3943 public void llCreateLink(string target, int parent)
4085 { 3944 {
4086 m_host.AddScriptLPS(1); 3945 m_host.AddScriptLPS(1);
4087 UUID invItemID = InventorySelf(); 3946
4088 UUID targetID; 3947 UUID targetID;
4089 3948
4090 if (!UUID.TryParse(target, out targetID)) 3949 if (!UUID.TryParse(target, out targetID))
4091 return; 3950 return;
4092 3951
4093 TaskInventoryItem item; 3952 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4094 m_host.TaskInventory.LockItemsForRead(true);
4095 item = m_host.TaskInventory[invItemID];
4096 m_host.TaskInventory.LockItemsForRead(false);
4097
4098 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4099 && !m_automaticLinkPermission) 3953 && !m_automaticLinkPermission)
4100 { 3954 {
4101 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3955 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
@@ -4103,7 +3957,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4103 } 3957 }
4104 3958
4105 IClientAPI client = null; 3959 IClientAPI client = null;
4106 ScenePresence sp = World.GetScenePresence(item.PermsGranter); 3960 ScenePresence sp = World.GetScenePresence(m_item.PermsGranter);
4107 if (sp != null) 3961 if (sp != null)
4108 client = sp.ControllingClient; 3962 client = sp.ControllingClient;
4109 3963
@@ -4149,18 +4003,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4149 public void llBreakLink(int linknum) 4003 public void llBreakLink(int linknum)
4150 { 4004 {
4151 m_host.AddScriptLPS(1); 4005 m_host.AddScriptLPS(1);
4152 UUID invItemID = InventorySelf();
4153 4006
4154 m_host.TaskInventory.LockItemsForRead(true); 4007 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4155 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 4008 && !m_automaticLinkPermission)
4156 && !m_automaticLinkPermission) 4009 {
4157 { 4010 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
4158 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 4011 return;
4159 m_host.TaskInventory.LockItemsForRead(false); 4012 }
4160 return; 4013
4161 }
4162 m_host.TaskInventory.LockItemsForRead(false);
4163
4164 if (linknum < ScriptBaseClass.LINK_THIS) 4014 if (linknum < ScriptBaseClass.LINK_THIS)
4165 return; 4015 return;
4166 4016
@@ -4259,12 +4109,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4259 { 4109 {
4260 m_host.AddScriptLPS(1); 4110 m_host.AddScriptLPS(1);
4261 4111
4262 UUID invItemID = InventorySelf(); 4112 TaskInventoryItem item = m_item;
4263
4264 TaskInventoryItem item;
4265 m_host.TaskInventory.LockItemsForRead(true);
4266 item = m_host.TaskInventory[invItemID];
4267 m_host.TaskInventory.LockItemsForRead(false);
4268 4113
4269 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 4114 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
4270 && !m_automaticLinkPermission) 4115 && !m_automaticLinkPermission)
@@ -4461,11 +4306,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4461 public void llGiveInventory(string destination, string inventory) 4306 public void llGiveInventory(string destination, string inventory)
4462 { 4307 {
4463 m_host.AddScriptLPS(1); 4308 m_host.AddScriptLPS(1);
4464 bool found = false; 4309
4465 UUID destId = UUID.Zero; 4310 UUID destId = UUID.Zero;
4466 UUID objId = UUID.Zero;
4467 int assetType = 0;
4468 string objName = String.Empty;
4469 4311
4470 if (!UUID.TryParse(destination, out destId)) 4312 if (!UUID.TryParse(destination, out destId))
4471 { 4313 {
@@ -4473,28 +4315,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4473 return; 4315 return;
4474 } 4316 }
4475 4317
4476 // move the first object found with this inventory name 4318 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory);
4477 m_host.TaskInventory.LockItemsForRead(true);
4478 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
4479 {
4480 if (inv.Value.Name == inventory)
4481 {
4482 found = true;
4483 objId = inv.Key;
4484 assetType = inv.Value.Type;
4485 objName = inv.Value.Name;
4486 break;
4487 }
4488 }
4489 m_host.TaskInventory.LockItemsForRead(false);
4490 4319
4491 if (!found) 4320 if (item == null)
4492 { 4321 {
4493 llSay(0, String.Format("Could not find object '{0}'", inventory)); 4322 llSay(0, String.Format("Could not find object '{0}'", inventory));
4494 return; 4323 return;
4495// throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory)); 4324// throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory));
4496 } 4325 }
4497 4326
4327 UUID objId = item.ItemID;
4328
4498 // check if destination is an object 4329 // check if destination is an object
4499 if (World.GetSceneObjectPart(destId) != null) 4330 if (World.GetSceneObjectPart(destId) != null)
4500 { 4331 {
@@ -4526,14 +4357,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4526 return; 4357 return;
4527 4358
4528 byte[] bucket = new byte[1]; 4359 byte[] bucket = new byte[1];
4529 bucket[0] = (byte)assetType; 4360 bucket[0] = (byte)item.Type;
4530 //byte[] objBytes = agentItem.ID.GetBytes(); 4361 //byte[] objBytes = agentItem.ID.GetBytes();
4531 //Array.Copy(objBytes, 0, bucket, 1, 16); 4362 //Array.Copy(objBytes, 0, bucket, 1, 16);
4532 4363
4533 GridInstantMessage msg = new GridInstantMessage(World, 4364 GridInstantMessage msg = new GridInstantMessage(World,
4534 m_host.OwnerID, m_host.Name, destId, 4365 m_host.OwnerID, m_host.Name, destId,
4535 (byte)InstantMessageDialog.TaskInventoryOffered, 4366 (byte)InstantMessageDialog.TaskInventoryOffered,
4536 false, objName+". "+m_host.Name+" is located at "+ 4367 false, item.Name+". "+m_host.Name+" is located at "+
4537 World.RegionInfo.RegionName+" "+ 4368 World.RegionInfo.RegionName+" "+
4538 m_host.AbsolutePosition.ToString(), 4369 m_host.AbsolutePosition.ToString(),
4539 agentItem.ID, true, m_host.AbsolutePosition, 4370 agentItem.ID, true, m_host.AbsolutePosition,
@@ -4561,27 +4392,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4561 { 4392 {
4562 m_host.AddScriptLPS(1); 4393 m_host.AddScriptLPS(1);
4563 4394
4564 List<TaskInventoryItem> inv; 4395 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
4565 try 4396
4566 { 4397 if (item == null)
4567 m_host.TaskInventory.LockItemsForRead(true); 4398 return;
4568 inv = new List<TaskInventoryItem>(m_host.TaskInventory.Values); 4399
4569 } 4400 if (item.ItemID == m_item.ItemID)
4570 finally 4401 throw new ScriptDeleteException();
4571 { 4402 else
4572 m_host.TaskInventory.LockItemsForRead(false); 4403 m_host.Inventory.RemoveInventoryItem(item.ItemID);
4573 }
4574 foreach (TaskInventoryItem item in inv)
4575 {
4576 if (item.Name == name)
4577 {
4578 if (item.ItemID == m_itemID)
4579 throw new ScriptDeleteException();
4580 else
4581 m_host.Inventory.RemoveInventoryItem(item.ItemID);
4582 return;
4583 }
4584 }
4585 } 4404 }
4586 4405
4587 public void llSetText(string text, LSL_Vector color, double alpha) 4406 public void llSetText(string text, LSL_Vector color, double alpha)
@@ -4709,8 +4528,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4709 UUID rq = UUID.Random(); 4528 UUID rq = UUID.Random();
4710 4529
4711 UUID tid = AsyncCommands. 4530 UUID tid = AsyncCommands.
4712 DataserverPlugin.RegisterRequest(m_localID, 4531 DataserverPlugin.RegisterRequest(m_host.LocalId,
4713 m_itemID, rq.ToString()); 4532 m_item.ItemID, rq.ToString());
4714 4533
4715 AsyncCommands. 4534 AsyncCommands.
4716 DataserverPlugin.DataserverReply(rq.ToString(), reply); 4535 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -4729,16 +4548,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4729 { 4548 {
4730 m_host.AddScriptLPS(1); 4549 m_host.AddScriptLPS(1);
4731 4550
4732 //Clone is thread safe 4551 foreach (TaskInventoryItem item in m_host.Inventory.GetInventoryItems())
4733 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
4734
4735 foreach (TaskInventoryItem item in itemDictionary.Values)
4736 { 4552 {
4737 if (item.Type == 3 && item.Name == name) 4553 if (item.Type == 3 && item.Name == name)
4738 { 4554 {
4739 UUID tid = AsyncCommands. 4555 UUID tid = AsyncCommands.
4740 DataserverPlugin.RegisterRequest(m_localID, 4556 DataserverPlugin.RegisterRequest(m_host.LocalId,
4741 m_itemID, item.AssetID.ToString()); 4557 m_item.ItemID, item.AssetID.ToString());
4742 4558
4743 Vector3 region = new Vector3( 4559 Vector3 region = new Vector3(
4744 World.RegionInfo.RegionLocX * Constants.RegionSize, 4560 World.RegionInfo.RegionLocX * Constants.RegionSize,
@@ -4764,6 +4580,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4764 return tid.ToString(); 4580 return tid.ToString();
4765 } 4581 }
4766 } 4582 }
4583
4767 ScriptSleep(1000); 4584 ScriptSleep(1000);
4768 return String.Empty; 4585 return String.Empty;
4769 } 4586 }
@@ -4956,19 +4773,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4956 UUID soundId = UUID.Zero; 4773 UUID soundId = UUID.Zero;
4957 if (!UUID.TryParse(impact_sound, out soundId)) 4774 if (!UUID.TryParse(impact_sound, out soundId))
4958 { 4775 {
4959 m_host.TaskInventory.LockItemsForRead(true); 4776 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(impact_sound);
4960 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4777
4961 { 4778 if (item != null && item.Type == (int)AssetType.Sound)
4962 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) 4779 soundId = item.AssetID;
4963 {
4964 soundId = item.AssetID;
4965 break;
4966 }
4967 }
4968 m_host.TaskInventory.LockItemsForRead(false);
4969 } 4780 }
4970 m_host.CollisionSoundVolume = (float)impact_volume; 4781
4971 m_host.CollisionSound = soundId; 4782 m_host.CollisionSound = soundId;
4783 m_host.CollisionSoundVolume = (float)impact_volume;
4972 m_host.CollisionSoundType = 1; 4784 m_host.CollisionSoundType = 1;
4973 } 4785 }
4974 4786
@@ -5010,10 +4822,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5010 UUID partItemID; 4822 UUID partItemID;
5011 foreach (SceneObjectPart part in parts) 4823 foreach (SceneObjectPart part in parts)
5012 { 4824 {
5013 //Clone is thread safe 4825 foreach (TaskInventoryItem item in part.Inventory.GetInventoryItems())
5014 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone();
5015
5016 foreach (TaskInventoryItem item in itemsDictionary.Values)
5017 { 4826 {
5018 if (item.Type == ScriptBaseClass.INVENTORY_SCRIPT) 4827 if (item.Type == ScriptBaseClass.INVENTORY_SCRIPT)
5019 { 4828 {
@@ -5211,22 +5020,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5211 5020
5212 public LSL_String llGetScriptName() 5021 public LSL_String llGetScriptName()
5213 { 5022 {
5214 string result = String.Empty;
5215
5216 m_host.AddScriptLPS(1); 5023 m_host.AddScriptLPS(1);
5217 5024
5218 m_host.TaskInventory.LockItemsForRead(true); 5025 return m_item.Name != null ? m_item.Name : String.Empty;
5219 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
5220 {
5221 if (item.Type == 10 && item.ItemID == m_itemID)
5222 {
5223 result = item.Name!=null?item.Name:String.Empty;
5224 break;
5225 }
5226 }
5227 m_host.TaskInventory.LockItemsForRead(false);
5228
5229 return result;
5230 } 5026 }
5231 5027
5232 public LSL_Integer llGetLinkNumberOfSides(int link) 5028 public LSL_Integer llGetLinkNumberOfSides(int link)
@@ -5397,22 +5193,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5397 { 5193 {
5398 m_host.AddScriptLPS(1); 5194 m_host.AddScriptLPS(1);
5399 5195
5400 m_host.TaskInventory.LockItemsForRead(true); 5196 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
5401 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 5197
5198 if (item == null)
5199 return UUID.Zero.ToString();
5200
5201 if ((item.CurrentPermissions
5202 & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
5203 == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
5402 { 5204 {
5403 if (inv.Value.Name == name) 5205 return item.AssetID.ToString();
5404 {
5405 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
5406 {
5407 m_host.TaskInventory.LockItemsForRead(false);
5408 return inv.Value.AssetID.ToString();
5409 }
5410 else
5411 {
5412 m_host.TaskInventory.LockItemsForRead(false);
5413 return UUID.Zero.ToString();
5414 }
5415 }
5416 } 5206 }
5417 m_host.TaskInventory.LockItemsForRead(false); 5207 m_host.TaskInventory.LockItemsForRead(false);
5418 5208
@@ -6360,7 +6150,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6360 } 6150 }
6361 } 6151 }
6362 } 6152 }
6363 List<UUID> presenceIds = new List<UUID>();
6364 6153
6365 World.ForEachRootScenePresence( 6154 World.ForEachRootScenePresence(
6366 delegate (ScenePresence ssp) 6155 delegate (ScenePresence ssp)
@@ -6511,7 +6300,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6511 if (m_host.OwnerID == land.LandData.OwnerID) 6300 if (m_host.OwnerID == land.LandData.OwnerID)
6512 { 6301 {
6513 Vector3 pos = World.GetNearestAllowedPosition(presence, land); 6302 Vector3 pos = World.GetNearestAllowedPosition(presence, land);
6514 presence.TeleportWithMomentum(pos); 6303 presence.TeleportWithMomentum(pos, null);
6515 presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); 6304 presence.ControllingClient.SendAlertMessage("You have been ejected from this land");
6516 } 6305 }
6517 } 6306 }
@@ -7036,22 +6825,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7036 } 6825 }
7037 } 6826 }
7038 6827
7039 protected UUID GetTaskInventoryItem(string name)
7040 {
7041 m_host.TaskInventory.LockItemsForRead(true);
7042 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
7043 {
7044 if (inv.Value.Name == name)
7045 {
7046 m_host.TaskInventory.LockItemsForRead(false);
7047 return inv.Key;
7048 }
7049 }
7050 m_host.TaskInventory.LockItemsForRead(false);
7051
7052 return UUID.Zero;
7053 }
7054
7055 public void llGiveInventoryList(string destination, string category, LSL_List inventory) 6828 public void llGiveInventoryList(string destination, string category, LSL_List inventory)
7056 { 6829 {
7057 m_host.AddScriptLPS(1); 6830 m_host.AddScriptLPS(1);
@@ -7064,16 +6837,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7064 6837
7065 foreach (Object item in inventory.Data) 6838 foreach (Object item in inventory.Data)
7066 { 6839 {
6840 string rawItemString = item.ToString();
6841
7067 UUID itemID; 6842 UUID itemID;
7068 if (UUID.TryParse(item.ToString(), out itemID)) 6843 if (UUID.TryParse(rawItemString, out itemID))
7069 { 6844 {
7070 itemList.Add(itemID); 6845 itemList.Add(itemID);
7071 } 6846 }
7072 else 6847 else
7073 { 6848 {
7074 itemID = GetTaskInventoryItem(item.ToString()); 6849 TaskInventoryItem taskItem = m_host.Inventory.GetInventoryItem(rawItemString);
7075 if (itemID != UUID.Zero) 6850
7076 itemList.Add(itemID); 6851 if (taskItem != null)
6852 itemList.Add(taskItem.ItemID);
7077 } 6853 }
7078 } 6854 }
7079 6855
@@ -7395,9 +7171,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7395 public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) 7171 public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param)
7396 { 7172 {
7397 m_host.AddScriptLPS(1); 7173 m_host.AddScriptLPS(1);
7398 bool found = false; 7174
7399 UUID destId = UUID.Zero; 7175 UUID destId = UUID.Zero;
7400 UUID srcId = UUID.Zero;
7401 7176
7402 if (!UUID.TryParse(target, out destId)) 7177 if (!UUID.TryParse(target, out destId))
7403 { 7178 {
@@ -7412,25 +7187,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7412 } 7187 }
7413 7188
7414 // copy the first script found with this inventory name 7189 // copy the first script found with this inventory name
7415 TaskInventoryItem scriptItem = null; 7190 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
7416 m_host.TaskInventory.LockItemsForRead(true);
7417 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
7418 {
7419 if (inv.Value.Name == name)
7420 {
7421 // make sure the object is a script
7422 if (10 == inv.Value.Type)
7423 {
7424 found = true;
7425 srcId = inv.Key;
7426 scriptItem = inv.Value;
7427 break;
7428 }
7429 }
7430 }
7431 m_host.TaskInventory.LockItemsForRead(false);
7432 7191
7433 if (!found) 7192 // make sure the object is a script
7193 if (item == null || item.Type != 10)
7434 { 7194 {
7435 llSay(0, "Could not find script " + name); 7195 llSay(0, "Could not find script " + name);
7436 return; 7196 return;
@@ -7439,13 +7199,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7439 SceneObjectPart dest = World.GetSceneObjectPart(destId); 7199 SceneObjectPart dest = World.GetSceneObjectPart(destId);
7440 if (dest != null) 7200 if (dest != null)
7441 { 7201 {
7442 if ((scriptItem.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID) 7202 if ((item.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID)
7443 { 7203 {
7444 // the rest of the permission checks are done in RezScript, so check the pin there as well 7204 // the rest of the permission checks are done in RezScript, so check the pin there as well
7445 World.RezScriptFromPrim(srcId, m_host, destId, pin, running, start_param); 7205 World.RezScriptFromPrim(item.ItemID, m_host, destId, pin, running, start_param);
7446 7206
7447 if ((scriptItem.BasePermissions & (uint)PermissionMask.Copy) == 0) 7207 if ((item.BasePermissions & (uint)PermissionMask.Copy) == 0)
7448 m_host.Inventory.RemoveInventoryItem(srcId); 7208 m_host.Inventory.RemoveInventoryItem(item.ItemID);
7449 } 7209 }
7450 } 7210 }
7451 // this will cause the delay even if the script pin or permissions were wrong - seems ok 7211 // this will cause the delay even if the script pin or permissions were wrong - seems ok
@@ -7458,14 +7218,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7458 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7218 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7459 if (xmlrpcMod.IsEnabled()) 7219 if (xmlrpcMod.IsEnabled())
7460 { 7220 {
7461 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); 7221 UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero);
7462 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); 7222 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>();
7463 if (xmlRpcRouter != null) 7223 if (xmlRpcRouter != null)
7464 { 7224 {
7465 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; 7225 string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName;
7466 7226
7467 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, 7227 xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID,
7468 m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, 7228 m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName,
7469 xmlrpcMod.Port.ToString())); 7229 xmlrpcMod.Port.ToString()));
7470 } 7230 }
7471 object[] resobj = new object[] 7231 object[] resobj = new object[]
@@ -7477,7 +7237,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7477 new LSL_Integer(0), 7237 new LSL_Integer(0),
7478 new LSL_String(String.Empty) 7238 new LSL_String(String.Empty)
7479 }; 7239 };
7480 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, 7240 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj,
7481 new DetectParams[0])); 7241 new DetectParams[0]));
7482 } 7242 }
7483 ScriptSleep(1000); 7243 ScriptSleep(1000);
@@ -7488,7 +7248,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7488 m_host.AddScriptLPS(1); 7248 m_host.AddScriptLPS(1);
7489 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7249 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7490 ScriptSleep(3000); 7250 ScriptSleep(3000);
7491 return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); 7251 return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString();
7492 } 7252 }
7493 7253
7494 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) 7254 public void llRemoteDataReply(string channel, string message_id, string sdata, int idata)
@@ -8475,7 +8235,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8475 return; 8235 return;
8476 face = (int)rules.GetLSLIntegerItem(idx++); 8236 face = (int)rules.GetLSLIntegerItem(idx++);
8477 int shiny = (int)rules.GetLSLIntegerItem(idx++); 8237 int shiny = (int)rules.GetLSLIntegerItem(idx++);
8478 Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); 8238 Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++);
8479 8239
8480 SetShiny(part, face, shiny, bump); 8240 SetShiny(part, face, shiny, bump);
8481 8241
@@ -10317,7 +10077,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10317 public LSL_String llGetSimulatorHostname() 10077 public LSL_String llGetSimulatorHostname()
10318 { 10078 {
10319 m_host.AddScriptLPS(1); 10079 m_host.AddScriptLPS(1);
10320 return System.Environment.MachineName; 10080 IUrlModule UrlModule = World.RequestModuleInterface<IUrlModule>();
10081 return UrlModule.ExternalHostNameForLSL;
10321 } 10082 }
10322 10083
10323 // <summary> 10084 // <summary>
@@ -10554,92 +10315,82 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10554 } 10315 }
10555 } 10316 }
10556 10317
10557 public LSL_Integer llGetInventoryPermMask(string item, int mask) 10318 public LSL_Integer llGetInventoryPermMask(string itemName, int mask)
10558 { 10319 {
10559 m_host.AddScriptLPS(1); 10320 m_host.AddScriptLPS(1);
10560 10321
10561 m_host.TaskInventory.LockItemsForRead(true); 10322 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
10562 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 10323
10324 if (item == null)
10325 return -1;
10326
10327 switch (mask)
10563 { 10328 {
10564 if (inv.Value.Name == item) 10329 case 0:
10565 { 10330 return (int)item.BasePermissions;
10566 m_host.TaskInventory.LockItemsForRead(false); 10331 case 1:
10567 switch (mask) 10332 return (int)item.CurrentPermissions;
10568 { 10333 case 2:
10569 case 0: 10334 return (int)item.GroupPermissions;
10570 return (int)inv.Value.BasePermissions; 10335 case 3:
10571 case 1: 10336 return (int)item.EveryonePermissions;
10572 return (int)inv.Value.CurrentPermissions; 10337 case 4:
10573 case 2: 10338 return (int)item.NextPermissions;
10574 return (int)inv.Value.GroupPermissions;
10575 case 3:
10576 return (int)inv.Value.EveryonePermissions;
10577 case 4:
10578 return (int)inv.Value.NextPermissions;
10579 }
10580 }
10581 } 10339 }
10582 m_host.TaskInventory.LockItemsForRead(false); 10340 m_host.TaskInventory.LockItemsForRead(false);
10583 10341
10584 return -1; 10342 return -1;
10585 } 10343 }
10586 10344
10587 public void llSetInventoryPermMask(string item, int mask, int value) 10345 public void llSetInventoryPermMask(string itemName, int mask, int value)
10588 { 10346 {
10589 m_host.AddScriptLPS(1); 10347 m_host.AddScriptLPS(1);
10348
10590 if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false)) 10349 if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false))
10591 { 10350 {
10592 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) 10351 if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID))
10593 { 10352 {
10594 lock (m_host.TaskInventory) 10353 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
10354
10355 if (item != null)
10595 { 10356 {
10596 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 10357 switch (mask)
10597 { 10358 {
10598 if (inv.Value.Name == item) 10359 case 0:
10599 { 10360 item.BasePermissions = (uint)value;
10600 switch (mask) 10361 break;
10601 { 10362 case 1:
10602 case 0: 10363 item.CurrentPermissions = (uint)value;
10603 inv.Value.BasePermissions = (uint)value; 10364 break;
10604 break; 10365 case 2:
10605 case 1: 10366 item.GroupPermissions = (uint)value;
10606 inv.Value.CurrentPermissions = (uint)value; 10367 break;
10607 break; 10368 case 3:
10608 case 2: 10369 item.EveryonePermissions = (uint)value;
10609 inv.Value.GroupPermissions = (uint)value; 10370 break;
10610 break; 10371 case 4:
10611 case 3: 10372 item.NextPermissions = (uint)value;
10612 inv.Value.EveryonePermissions = (uint)value; 10373 break;
10613 break;
10614 case 4:
10615 inv.Value.NextPermissions = (uint)value;
10616 break;
10617 }
10618 }
10619 } 10374 }
10620 } 10375 }
10621 } 10376 }
10622 } 10377 }
10623 } 10378 }
10624 10379
10625 public LSL_String llGetInventoryCreator(string item) 10380 public LSL_String llGetInventoryCreator(string itemName)
10626 { 10381 {
10627 m_host.AddScriptLPS(1); 10382 m_host.AddScriptLPS(1);
10628 10383
10629 m_host.TaskInventory.LockItemsForRead(true); 10384 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
10630 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 10385
10386 if (item == null)
10631 { 10387 {
10632 if (inv.Value.Name == item) 10388 llSay(0, "No item name '" + item + "'");
10633 {
10634 m_host.TaskInventory.LockItemsForRead(false);
10635 return inv.Value.CreatorID.ToString();
10636 }
10637 }
10638 m_host.TaskInventory.LockItemsForRead(false);
10639 10389
10640 llSay(0, "No item name '" + item + "'"); 10390 return String.Empty;
10391 }
10641 10392
10642 return String.Empty; 10393 return item.CreatorID.ToString();
10643 } 10394 }
10644 10395
10645 public void llOwnerSay(string msg) 10396 public void llOwnerSay(string msg)
@@ -10656,13 +10407,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10656 { 10407 {
10657 m_host.AddScriptLPS(1); 10408 m_host.AddScriptLPS(1);
10658 if (m_UrlModule != null) 10409 if (m_UrlModule != null)
10659 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 10410 return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
10660 return UUID.Zero.ToString(); 10411 return UUID.Zero.ToString();
10661 } 10412 }
10662 10413
10663 public LSL_String llRequestSimulatorData(string simulator, int data) 10414 public LSL_String llRequestSimulatorData(string simulator, int data)
10664 { 10415 {
10665 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); 10416 IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL");
10666 10417
10667 try 10418 try
10668 { 10419 {
@@ -10672,7 +10423,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10672 10423
10673 GridRegion info; 10424 GridRegion info;
10674 10425
10675 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) 10426 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) //Det data for this simulator?
10427
10676 info = new GridRegion(m_ScriptEngine.World.RegionInfo); 10428 info = new GridRegion(m_ScriptEngine.World.RegionInfo);
10677 else 10429 else
10678 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); 10430 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator);
@@ -10685,10 +10437,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10685 ScriptSleep(1000); 10437 ScriptSleep(1000);
10686 return UUID.Zero.ToString(); 10438 return UUID.Zero.ToString();
10687 } 10439 }
10688 reply = new LSL_Vector( 10440 if (m_ScriptEngine.World.RegionInfo.RegionName != simulator)
10689 info.RegionLocX, 10441 {
10690 info.RegionLocY, 10442 //Hypergrid Region co-ordinates
10691 0).ToString(); 10443 uint rx = 0, ry = 0;
10444 Utils.LongToUInts(Convert.ToUInt64(info.RegionSecret), out rx, out ry);
10445
10446 reply = new LSL_Vector(
10447 rx,
10448 ry,
10449 0).ToString();
10450 }
10451 else
10452 {
10453 //Local-cooridnates
10454 reply = new LSL_Vector(
10455 info.RegionLocX,
10456 info.RegionLocY,
10457 0).ToString();
10458 }
10692 break; 10459 break;
10693 case ScriptBaseClass.DATA_SIM_STATUS: 10460 case ScriptBaseClass.DATA_SIM_STATUS:
10694 if (info != null) 10461 if (info != null)
@@ -10724,7 +10491,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10724 UUID rq = UUID.Random(); 10491 UUID rq = UUID.Random();
10725 10492
10726 UUID tid = AsyncCommands. 10493 UUID tid = AsyncCommands.
10727 DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 10494 DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
10728 10495
10729 AsyncCommands. 10496 AsyncCommands.
10730 DataserverPlugin.DataserverReply(rq.ToString(), reply); 10497 DataserverPlugin.DataserverReply(rq.ToString(), reply);
@@ -10743,7 +10510,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10743 m_host.AddScriptLPS(1); 10510 m_host.AddScriptLPS(1);
10744 10511
10745 if (m_UrlModule != null) 10512 if (m_UrlModule != null)
10746 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); 10513 return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString();
10747 return UUID.Zero.ToString(); 10514 return UUID.Zero.ToString();
10748 } 10515 }
10749 10516
@@ -10779,7 +10546,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10779 // child agents have a mass of 1.0 10546 // child agents have a mass of 1.0
10780 return 1; 10547 return 1;
10781 else 10548 else
10782 return avatar.GetMass(); 10549 return (double)avatar.GetMass();
10783 } 10550 }
10784 catch (KeyNotFoundException) 10551 catch (KeyNotFoundException)
10785 { 10552 {
@@ -11183,18 +10950,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11183 { 10950 {
11184 m_host.AddScriptLPS(1); 10951 m_host.AddScriptLPS(1);
11185 10952
11186 m_host.TaskInventory.LockItemsForRead(true); 10953 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
11187 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
11188 {
11189 if (inv.Value.Name == name)
11190 {
11191 m_host.TaskInventory.LockItemsForRead(false);
11192 return inv.Value.Type;
11193 }
11194 }
11195 m_host.TaskInventory.LockItemsForRead(false);
11196 10954
11197 return -1; 10955 if (item == null)
10956 return -1;
10957
10958 return item.Type;
11198 } 10959 }
11199 10960
11200 public void llSetPayPrice(int price, LSL_List quick_pay_buttons) 10961 public void llSetPayPrice(int price, LSL_List quick_pay_buttons)
@@ -11222,32 +10983,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11222 public LSL_Vector llGetCameraPos() 10983 public LSL_Vector llGetCameraPos()
11223 { 10984 {
11224 m_host.AddScriptLPS(1); 10985 m_host.AddScriptLPS(1);
11225 UUID invItemID = InventorySelf();
11226 10986
11227 if (invItemID == UUID.Zero) 10987 if (m_item.PermsGranter == UUID.Zero)
11228 return new LSL_Vector(); 10988 return new LSL_Vector();
11229
11230 m_host.TaskInventory.LockItemsForRead(true);
11231
11232 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter;
11233
11234// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
11235 if (agentID == UUID.Zero)
11236 {
11237 m_host.TaskInventory.LockItemsForRead(false);
11238 return new LSL_Vector();
11239 }
11240 10989
11241 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 10990 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
11242 { 10991 {
11243 ShoutError("No permissions to track the camera"); 10992 ShoutError("No permissions to track the camera");
11244 m_host.TaskInventory.LockItemsForRead(false);
11245 return new LSL_Vector(); 10993 return new LSL_Vector();
11246 } 10994 }
11247 m_host.TaskInventory.LockItemsForRead(false);
11248 10995
11249// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10996// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
11250 ScenePresence presence = World.GetScenePresence(agentID); 10997 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
11251 if (presence != null) 10998 if (presence != null)
11252 { 10999 {
11253 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); 11000 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z);
@@ -11259,30 +11006,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11259 public LSL_Rotation llGetCameraRot() 11006 public LSL_Rotation llGetCameraRot()
11260 { 11007 {
11261 m_host.AddScriptLPS(1); 11008 m_host.AddScriptLPS(1);
11262 UUID invItemID = InventorySelf();
11263 if (invItemID == UUID.Zero)
11264 return new LSL_Rotation();
11265
11266 m_host.TaskInventory.LockItemsForRead(true);
11267 11009
11268 UUID agentID = m_host.TaskInventory[invItemID].PermsGranter; 11010 if (m_item.PermsGranter == UUID.Zero)
11011 return new LSL_Rotation();
11269 11012
11270// if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 11013 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
11271 if (agentID == UUID.Zero)
11272 {
11273 m_host.TaskInventory.LockItemsForRead(false);
11274 return new LSL_Rotation();
11275 }
11276 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
11277 { 11014 {
11278 ShoutError("No permissions to track the camera"); 11015 ShoutError("No permissions to track the camera");
11279 m_host.TaskInventory.LockItemsForRead(false);
11280 return new LSL_Rotation(); 11016 return new LSL_Rotation();
11281 } 11017 }
11282 m_host.TaskInventory.LockItemsForRead(false);
11283 11018
11284// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 11019// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
11285 ScenePresence presence = World.GetScenePresence(agentID); 11020 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
11286 if (presence != null) 11021 if (presence != null)
11287 { 11022 {
11288 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); 11023 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W);
@@ -11341,7 +11076,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11341 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) 11076 public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt)
11342 { 11077 {
11343 m_host.AddScriptLPS(1); 11078 m_host.AddScriptLPS(1);
11344 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); 11079 DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0);
11345 if (detectedParams == null) 11080 if (detectedParams == null)
11346 { 11081 {
11347 if (m_host.ParentGroup.IsAttachment == true) 11082 if (m_host.ParentGroup.IsAttachment == true)
@@ -11465,30 +11200,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11465 { 11200 {
11466 m_host.AddScriptLPS(1); 11201 m_host.AddScriptLPS(1);
11467 11202
11468 // our key in the object we are in
11469 UUID invItemID = InventorySelf();
11470 if (invItemID == UUID.Zero) return;
11471
11472 // the object we are in 11203 // the object we are in
11473 UUID objectID = m_host.ParentUUID; 11204 UUID objectID = m_host.ParentUUID;
11474 if (objectID == UUID.Zero) return; 11205 if (objectID == UUID.Zero)
11206 return;
11475 11207
11476 UUID agentID;
11477 m_host.TaskInventory.LockItemsForRead(true);
11478 // we need the permission first, to know which avatar we want to set the camera for 11208 // we need the permission first, to know which avatar we want to set the camera for
11479 agentID = m_host.TaskInventory[invItemID].PermsGranter; 11209 UUID agentID = m_item.PermsGranter;
11480 11210
11481 if (agentID == UUID.Zero) 11211 if (agentID == UUID.Zero)
11482 {
11483 m_host.TaskInventory.LockItemsForRead(false);
11484 return; 11212 return;
11485 } 11213
11486 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 11214 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
11487 {
11488 m_host.TaskInventory.LockItemsForRead(false);
11489 return; 11215 return;
11490 }
11491 m_host.TaskInventory.LockItemsForRead(false);
11492 11216
11493 ScenePresence presence = World.GetScenePresence(agentID); 11217 ScenePresence presence = World.GetScenePresence(agentID);
11494 11218
@@ -11530,34 +11254,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11530 { 11254 {
11531 m_host.AddScriptLPS(1); 11255 m_host.AddScriptLPS(1);
11532 11256
11533 // our key in the object we are in
11534 UUID invItemID=InventorySelf();
11535 if (invItemID == UUID.Zero) return;
11536
11537 // the object we are in 11257 // the object we are in
11538 UUID objectID = m_host.ParentUUID; 11258 UUID objectID = m_host.ParentUUID;
11539 if (objectID == UUID.Zero) return; 11259 if (objectID == UUID.Zero)
11260 return;
11540 11261
11541 // we need the permission first, to know which avatar we want to clear the camera for 11262 // we need the permission first, to know which avatar we want to clear the camera for
11542 UUID agentID; 11263 UUID agentID = m_item.PermsGranter;
11543 m_host.TaskInventory.LockItemsForRead(true); 11264
11544 agentID = m_host.TaskInventory[invItemID].PermsGranter;
11545 if (agentID == UUID.Zero) 11265 if (agentID == UUID.Zero)
11546 {
11547 m_host.TaskInventory.LockItemsForRead(false);
11548 return; 11266 return;
11549 } 11267
11550 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) 11268 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
11551 {
11552 m_host.TaskInventory.LockItemsForRead(false);
11553 return; 11269 return;
11554 }
11555 m_host.TaskInventory.LockItemsForRead(false);
11556 11270
11557 ScenePresence presence = World.GetScenePresence(agentID); 11271 ScenePresence presence = World.GetScenePresence(agentID);
11558 11272
11559 // we are not interested in child-agents 11273 // we are not interested in child-agents
11560 if (presence.IsChildAgent) return; 11274 if (presence.IsChildAgent)
11275 return;
11561 11276
11562 presence.ControllingClient.SendClearFollowCamProperties(objectID); 11277 presence.ControllingClient.SendClearFollowCamProperties(objectID);
11563 } 11278 }
@@ -11748,8 +11463,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11748 } 11463 }
11749 } 11464 }
11750 11465
11751 UUID reqID = httpScriptMod. 11466 UUID reqID
11752 StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); 11467 = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body);
11753 11468
11754 if (reqID != UUID.Zero) 11469 if (reqID != UUID.Zero)
11755 return reqID.ToString(); 11470 return reqID.ToString();
@@ -12003,19 +11718,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12003 break; 11718 break;
12004 // For the following 8 see the Object version below 11719 // For the following 8 see the Object version below
12005 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11720 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
12006 ret.Add(new LSL_Integer(0)); 11721 ret.Add(new LSL_Integer(av.RunningScriptCount()));
12007 break; 11722 break;
12008 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11723 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
12009 ret.Add(new LSL_Integer(0)); 11724 ret.Add(new LSL_Integer(av.ScriptCount()));
12010 break; 11725 break;
12011 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11726 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
12012 ret.Add(new LSL_Integer(0)); 11727 ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384));
12013 break; 11728 break;
12014 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11729 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
12015 ret.Add(new LSL_Float(0)); 11730 ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f));
12016 break; 11731 break;
12017 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11732 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
12018 ret.Add(new LSL_Integer(0)); 11733 ret.Add(new LSL_Integer(1));
12019 break; 11734 break;
12020 case ScriptBaseClass.OBJECT_SERVER_COST: 11735 case ScriptBaseClass.OBJECT_SERVER_COST:
12021 ret.Add(new LSL_Float(0)); 11736 ret.Add(new LSL_Float(0));
@@ -12073,37 +11788,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12073 case ScriptBaseClass.OBJECT_CREATOR: 11788 case ScriptBaseClass.OBJECT_CREATOR:
12074 ret.Add(new LSL_String(obj.CreatorID.ToString())); 11789 ret.Add(new LSL_String(obj.CreatorID.ToString()));
12075 break; 11790 break;
12076 // The following 8 I have intentionaly coded to return zero. They are part of
12077 // "Land Impact" calculations. These calculations are probably not applicable
12078 // to OpenSim, required figures (cpu/memory usage) are not currently tracked
12079 // I have intentionally left these all at zero rather than return possibly
12080 // missleading numbers
12081 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: 11791 case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
12082 // in SL this currently includes crashed scripts 11792 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount()));
12083 ret.Add(new LSL_Integer(0));
12084 break; 11793 break;
12085 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: 11794 case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
12086 ret.Add(new LSL_Integer(0)); 11795 ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount()));
12087 break; 11796 break;
12088 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: 11797 case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
12089 // The value returned in SL for mono scripts is 65536 * number of active scripts 11798 // The value returned in SL for mono scripts is 65536 * number of active scripts
12090 ret.Add(new LSL_Integer(0)); 11799 // and 16384 * number of active scripts for LSO. since llGetFreememory
11800 // is coded to give the LSO value use it here
11801 ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384));
12091 break; 11802 break;
12092 case ScriptBaseClass.OBJECT_SCRIPT_TIME: 11803 case ScriptBaseClass.OBJECT_SCRIPT_TIME:
12093 // Average cpu time per simulator frame expended on all scripts in the objetc 11804 // Average cpu time in seconds per simulator frame expended on all scripts in the object
12094 ret.Add(new LSL_Float(0)); 11805 ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f));
12095 break; 11806 break;
12096 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: 11807 case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
12097 // according to the SL wiki A prim or linkset will have prim 11808 // according to the SL wiki A prim or linkset will have prim
12098 // equivalent of the number of prims in a linkset if it does not 11809 // equivalent of the number of prims in a linkset if it does not
12099 // contain a mesh anywhere in the link set or is not a normal prim 11810 // contain a mesh anywhere in the link set or is not a normal prim
12100 // The value returned in SL for normal prims is prim count 11811 // The value returned in SL for normal prims is prim count
12101 ret.Add(new LSL_Integer(0)); 11812 ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount));
12102 break; 11813 break;
12103 11814
12104 // costs below may need to be diferent for root parts, need to check 11815 // costs below may need to be diferent for root parts, need to check
12105 case ScriptBaseClass.OBJECT_SERVER_COST: 11816 case ScriptBaseClass.OBJECT_SERVER_COST:
12106 // The value returned in SL for normal prims is prim count 11817 // The linden calculation is here
11818 // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight
11819 // The value returned in SL for normal prims looks like the prim count
12107 ret.Add(new LSL_Float(0)); 11820 ret.Add(new LSL_Float(0));
12108 break; 11821 break;
12109 case ScriptBaseClass.OBJECT_STREAMING_COST: 11822 case ScriptBaseClass.OBJECT_STREAMING_COST:
@@ -12128,22 +11841,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12128 return new LSL_List(); 11841 return new LSL_List();
12129 } 11842 }
12130 11843
12131 internal UUID ScriptByName(string name) 11844 internal UUID GetScriptByName(string name)
12132 { 11845 {
12133 m_host.TaskInventory.LockItemsForRead(true); 11846 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
12134 11847
12135 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 11848 if (item == null || item.Type != 10)
12136 { 11849 return UUID.Zero;
12137 if (item.Type == 10 && item.Name == name)
12138 {
12139 m_host.TaskInventory.LockItemsForRead(false);
12140 return item.ItemID;
12141 }
12142 }
12143
12144 m_host.TaskInventory.LockItemsForRead(false);
12145 11850
12146 return UUID.Zero; 11851 return item.ItemID;
12147 } 11852 }
12148 11853
12149 internal void ShoutError(string msg) 11854 internal void ShoutError(string msg)
@@ -12183,21 +11888,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12183 { 11888 {
12184 m_host.AddScriptLPS(1); 11889 m_host.AddScriptLPS(1);
12185 11890
12186 //Clone is thread safe
12187 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
12188
12189 UUID assetID = UUID.Zero; 11891 UUID assetID = UUID.Zero;
12190 11892
12191 if (!UUID.TryParse(name, out assetID)) 11893 if (!UUID.TryParse(name, out assetID))
12192 { 11894 {
12193 foreach (TaskInventoryItem item in itemsDictionary.Values) 11895 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
12194 { 11896
12195 if (item.Type == 7 && item.Name == name) 11897 if (item != null && item.Type == 7)
12196 { 11898 assetID = item.AssetID;
12197 assetID = item.AssetID;
12198 break;
12199 }
12200 }
12201 } 11899 }
12202 11900
12203 if (assetID == UUID.Zero) 11901 if (assetID == UUID.Zero)
@@ -12209,7 +11907,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12209 } 11907 }
12210 11908
12211 // was: UUID tid = tid = AsyncCommands. 11909 // was: UUID tid = tid = AsyncCommands.
12212 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11910 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
12213 11911
12214 if (NotecardCache.IsCached(assetID)) 11912 if (NotecardCache.IsCached(assetID))
12215 { 11913 {
@@ -12228,9 +11926,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12228 return; 11926 return;
12229 } 11927 }
12230 11928
12231 System.Text.UTF8Encoding enc = 11929 string data = Encoding.UTF8.GetString(a.Data);
12232 new System.Text.UTF8Encoding();
12233 string data = enc.GetString(a.Data);
12234 //m_log.Debug(data); 11930 //m_log.Debug(data);
12235 NotecardCache.Cache(id, data); 11931 NotecardCache.Cache(id, data);
12236 AsyncCommands. 11932 AsyncCommands.
@@ -12246,21 +11942,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12246 { 11942 {
12247 m_host.AddScriptLPS(1); 11943 m_host.AddScriptLPS(1);
12248 11944
12249 //Clone is thread safe
12250 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
12251
12252 UUID assetID = UUID.Zero; 11945 UUID assetID = UUID.Zero;
12253 11946
12254 if (!UUID.TryParse(name, out assetID)) 11947 if (!UUID.TryParse(name, out assetID))
12255 { 11948 {
12256 foreach (TaskInventoryItem item in itemsDictionary.Values) 11949 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
12257 { 11950
12258 if (item.Type == 7 && item.Name == name) 11951 if (item != null && item.Type == 7)
12259 { 11952 assetID = item.AssetID;
12260 assetID = item.AssetID;
12261 break;
12262 }
12263 }
12264 } 11953 }
12265 11954
12266 if (assetID == UUID.Zero) 11955 if (assetID == UUID.Zero)
@@ -12272,7 +11961,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12272 } 11961 }
12273 11962
12274 // was: UUID tid = tid = AsyncCommands. 11963 // was: UUID tid = tid = AsyncCommands.
12275 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); 11964 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString());
12276 11965
12277 if (NotecardCache.IsCached(assetID)) 11966 if (NotecardCache.IsCached(assetID))
12278 { 11967 {
@@ -12290,9 +11979,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12290 return; 11979 return;
12291 } 11980 }
12292 11981
12293 System.Text.UTF8Encoding enc = 11982 string data = Encoding.UTF8.GetString(a.Data);
12294 new System.Text.UTF8Encoding();
12295 string data = enc.GetString(a.Data);
12296 //m_log.Debug(data); 11983 //m_log.Debug(data);
12297 NotecardCache.Cache(id, data); 11984 NotecardCache.Cache(id, data);
12298 AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(), 11985 AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(),
@@ -12356,7 +12043,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12356 { 12043 {
12357 UUID rq = UUID.Random(); 12044 UUID rq = UUID.Random();
12358 12045
12359 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 12046 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
12360 12047
12361 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); 12048 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id)));
12362 12049
@@ -12372,7 +12059,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12372 { 12059 {
12373 UUID rq = UUID.Random(); 12060 UUID rq = UUID.Random();
12374 12061
12375 AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); 12062 AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString());
12376 12063
12377 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); 12064 AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id));
12378 12065
@@ -12574,7 +12261,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12574 { 12261 {
12575 Tri t1 = new Tri(); 12262 Tri t1 = new Tri();
12576 Tri t2 = new Tri(); 12263 Tri t2 = new Tri();
12577 12264
12578 Vector3 p1 = new Vector3(x-1, y-1, (float)heightfield[x-1, y-1]); 12265 Vector3 p1 = new Vector3(x-1, y-1, (float)heightfield[x-1, y-1]);
12579 Vector3 p2 = new Vector3(x, y-1, (float)heightfield[x, y-1]); 12266 Vector3 p2 = new Vector3(x, y-1, (float)heightfield[x, y-1]);
12580 Vector3 p3 = new Vector3(x, y, (float)heightfield[x, y]); 12267 Vector3 p3 = new Vector3(x, y, (float)heightfield[x, y]);
@@ -12615,7 +12302,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12615 // sometimes 12302 // sometimes
12616 if (Math.Abs(b) < 0.000001) 12303 if (Math.Abs(b) < 0.000001)
12617 continue; 12304 continue;
12618 12305
12619 double r = a / b; 12306 double r = a / b;
12620 12307
12621 // ray points away from plane 12308 // ray points away from plane
@@ -12875,7 +12562,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12875 bool isAccount = false; 12562 bool isAccount = false;
12876 bool isGroup = false; 12563 bool isGroup = false;
12877 12564
12878 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) 12565 if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID))
12879 return 0; 12566 return 0;
12880 12567
12881 UUID id = new UUID(); 12568 UUID id = new UUID();
@@ -12937,35 +12624,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12937 return 1; 12624 return 1;
12938 } 12625 }
12939 12626
12940 #region Not Implemented 12627 public LSL_Integer llGetMemoryLimit()
12941 // 12628 {
12942 // Listing the unimplemented lsl functions here, please move 12629 m_host.AddScriptLPS(1);
12943 // them from this region as they are completed 12630 // The value returned for LSO scripts in SL
12944 // 12631 return 16384;
12632 }
12945 12633
12946 public void llGetEnv(LSL_String name) 12634 public LSL_Integer llSetMemoryLimit(LSL_Integer limit)
12947 { 12635 {
12948 m_host.AddScriptLPS(1); 12636 m_host.AddScriptLPS(1);
12949 NotImplemented("llGetEnv"); 12637 // Treat as an LSO script
12638 return ScriptBaseClass.FALSE;
12950 } 12639 }
12951 12640
12952 public void llGetSPMaxMemory() 12641 public LSL_Integer llGetSPMaxMemory()
12953 { 12642 {
12954 m_host.AddScriptLPS(1); 12643 m_host.AddScriptLPS(1);
12955 NotImplemented("llGetSPMaxMemory"); 12644 // The value returned for LSO scripts in SL
12645 return 16384;
12956 } 12646 }
12957 12647
12958 public virtual LSL_Integer llGetUsedMemory() 12648 public virtual LSL_Integer llGetUsedMemory()
12959 { 12649 {
12960 m_host.AddScriptLPS(1); 12650 m_host.AddScriptLPS(1);
12961 NotImplemented("llGetUsedMemory"); 12651 // The value returned for LSO scripts in SL
12962 return 0; 12652 return 16384;
12963 } 12653 }
12964 12654
12965 public void llScriptProfiler(LSL_Integer flags) 12655 public void llScriptProfiler(LSL_Integer flags)
12966 { 12656 {
12967 m_host.AddScriptLPS(1); 12657 m_host.AddScriptLPS(1);
12968 //NotImplemented("llScriptProfiler"); 12658 // This does nothing for LSO scripts in SL
12659 }
12660
12661 #region Not Implemented
12662 //
12663 // Listing the unimplemented lsl functions here, please move
12664 // them from this region as they are completed
12665 //
12666
12667 public void llGetEnv(LSL_String name)
12668 {
12669 m_host.AddScriptLPS(1);
12670 NotImplemented("llGetEnv");
12969 } 12671 }
12970 12672
12971 public void llSetSoundQueueing(int queue) 12673 public void llSetSoundQueueing(int queue)
@@ -13045,8 +12747,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13045 12747
13046 try 12748 try
13047 { 12749 {
13048 UUID invItemID=InventorySelf(); 12750 TaskInventoryItem item = m_item;
13049 if (invItemID == UUID.Zero) 12751 if (item == null)
13050 { 12752 {
13051 replydata = "SERVICE_ERROR"; 12753 replydata = "SERVICE_ERROR";
13052 return; 12754 return;
@@ -13054,10 +12756,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13054 12756
13055 m_host.AddScriptLPS(1); 12757 m_host.AddScriptLPS(1);
13056 12758
13057 m_host.TaskInventory.LockItemsForRead(true);
13058 TaskInventoryItem item = m_host.TaskInventory[invItemID];
13059 m_host.TaskInventory.LockItemsForRead(false);
13060
13061 if (item.PermsGranter == UUID.Zero) 12759 if (item.PermsGranter == UUID.Zero)
13062 { 12760 {
13063 replydata = "MISSING_PERMISSION_DEBIT"; 12761 replydata = "MISSING_PERMISSION_DEBIT";
@@ -13099,7 +12797,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13099 } 12797 }
13100 finally 12798 finally
13101 { 12799 {
13102 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 12800 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams(
13103 "transaction_result", new Object[] { 12801 "transaction_result", new Object[] {
13104 new LSL_String(txn.ToString()), 12802 new LSL_String(txn.ToString()),
13105 new LSL_Integer(replycode), 12803 new LSL_Integer(replycode),