diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation')
7 files changed, 845 insertions, 937 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs index 47ed6ba..684138f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/ApiManager.cs | |||
@@ -29,42 +29,43 @@ using System; | |||
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using log4net; | ||
32 | using OpenSim.Region.ScriptEngine.Interfaces; | 33 | using OpenSim.Region.ScriptEngine.Interfaces; |
33 | 34 | ||
34 | namespace OpenSim.Region.ScriptEngine.Shared.Api | 35 | namespace OpenSim.Region.ScriptEngine.Shared.Api |
35 | { | 36 | { |
36 | public class ApiManager | 37 | public class ApiManager |
37 | { | 38 | { |
39 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
40 | |||
38 | private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>(); | 41 | private Dictionary<string,Type> m_Apis = new Dictionary<string,Type>(); |
39 | 42 | ||
40 | public string[] GetApis() | 43 | public string[] GetApis() |
41 | { | 44 | { |
42 | if (m_Apis.Count > 0) | 45 | if (m_Apis.Count <= 0) |
43 | { | 46 | { |
44 | List<string> l = new List<string>(m_Apis.Keys); | 47 | Assembly a = Assembly.GetExecutingAssembly(); |
45 | return l.ToArray(); | ||
46 | } | ||
47 | 48 | ||
48 | Assembly a = Assembly.GetExecutingAssembly(); | 49 | Type[] types = a.GetExportedTypes(); |
49 | 50 | ||
50 | Type[] types = a.GetExportedTypes(); | 51 | foreach (Type t in types) |
51 | |||
52 | foreach (Type t in types) | ||
53 | { | ||
54 | string name = t.ToString(); | ||
55 | int idx = name.LastIndexOf('.'); | ||
56 | if (idx != -1) | ||
57 | name = name.Substring(idx+1); | ||
58 | |||
59 | if (name.EndsWith("_Api")) | ||
60 | { | 52 | { |
61 | name = name.Substring(0, name.Length - 4); | 53 | string name = t.ToString(); |
62 | m_Apis[name] = t; | 54 | int idx = name.LastIndexOf('.'); |
55 | if (idx != -1) | ||
56 | name = name.Substring(idx+1); | ||
57 | |||
58 | if (name.EndsWith("_Api")) | ||
59 | { | ||
60 | name = name.Substring(0, name.Length - 4); | ||
61 | m_Apis[name] = t; | ||
62 | } | ||
63 | } | 63 | } |
64 | } | 64 | } |
65 | 65 | ||
66 | List<string> ret = new List<string>(m_Apis.Keys); | 66 | // m_log.DebugFormat("[API MANAGER]: Found {0} apis", m_Apis.Keys.Count); |
67 | return ret.ToArray(); | 67 | |
68 | return new List<string>(m_Apis.Keys).ToArray(); | ||
68 | } | 69 | } |
69 | 70 | ||
70 | public IScriptApi CreateApi(string api) | 71 | public IScriptApi CreateApi(string api) |
@@ -76,4 +77,4 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
76 | return ret; | 77 | return ret; |
77 | } | 78 | } |
78 | } | 79 | } |
79 | } | 80 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs index 489c1c6..b5fa6de 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs | |||
@@ -59,16 +59,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
59 | { | 59 | { |
60 | internal IScriptEngine m_ScriptEngine; | 60 | internal IScriptEngine m_ScriptEngine; |
61 | internal SceneObjectPart m_host; | 61 | internal SceneObjectPart m_host; |
62 | internal uint m_localID; | 62 | internal TaskInventoryItem m_item; |
63 | internal UUID m_itemID; | ||
64 | internal bool m_CMFunctionsEnabled = false; | 63 | internal bool m_CMFunctionsEnabled = false; |
65 | 64 | ||
66 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 65 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
67 | { | 66 | { |
68 | m_ScriptEngine = ScriptEngine; | 67 | m_ScriptEngine = ScriptEngine; |
69 | m_host = host; | 68 | m_host = host; |
70 | m_localID = localID; | 69 | m_item = item; |
71 | m_itemID = itemID; | ||
72 | 70 | ||
73 | if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false)) | 71 | if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false)) |
74 | m_CMFunctionsEnabled = true; | 72 | m_CMFunctionsEnabled = true; |
@@ -95,7 +93,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
95 | public string cmDetectedCountry(int number) | 93 | public string cmDetectedCountry(int number) |
96 | { | 94 | { |
97 | m_host.AddScriptLPS(1); | 95 | m_host.AddScriptLPS(1); |
98 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 96 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
99 | if (detectedParams == null) | 97 | if (detectedParams == null) |
100 | return String.Empty; | 98 | return String.Empty; |
101 | return detectedParams.Country; | 99 | return detectedParams.Country; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ca62bac..e9db5d5 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 | |||
420 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
421 | { | ||
422 | if (inv.Value.Name == name) | ||
423 | { | ||
424 | m_host.TaskInventory.LockItemsForRead(false); | ||
425 | return inv.Value.AssetID; | ||
426 | } | ||
427 | } | ||
428 | 384 | ||
429 | m_host.TaskInventory.LockItemsForRead(false); | 385 | if (item != null && item.Type == type) |
430 | 386 | return item.AssetID; | |
431 | 387 | else | |
432 | return UUID.Zero; | 388 | 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 |
@@ -1010,7 +968,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1010 | UUID.TryParse(ID, out keyID); | 968 | UUID.TryParse(ID, out keyID); |
1011 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 969 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
1012 | if (wComm != null) | 970 | if (wComm != null) |
1013 | return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); | 971 | return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg); |
1014 | else | 972 | else |
1015 | return -1; | 973 | return -1; |
1016 | } | 974 | } |
@@ -1020,7 +978,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1020 | m_host.AddScriptLPS(1); | 978 | m_host.AddScriptLPS(1); |
1021 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 979 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
1022 | if (wComm != null) | 980 | if (wComm != null) |
1023 | wComm.ListenControl(m_itemID, number, active); | 981 | wComm.ListenControl(m_item.ItemID, number, active); |
1024 | } | 982 | } |
1025 | 983 | ||
1026 | public void llListenRemove(int number) | 984 | public void llListenRemove(int number) |
@@ -1028,7 +986,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1028 | m_host.AddScriptLPS(1); | 986 | m_host.AddScriptLPS(1); |
1029 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 987 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
1030 | if (wComm != null) | 988 | if (wComm != null) |
1031 | wComm.ListenRemove(m_itemID, number); | 989 | wComm.ListenRemove(m_item.ItemID, number); |
1032 | } | 990 | } |
1033 | 991 | ||
1034 | public void llSensor(string name, string id, int type, double range, double arc) | 992 | public void llSensor(string name, string id, int type, double range, double arc) |
@@ -1037,7 +995,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1037 | UUID keyID = UUID.Zero; | 995 | UUID keyID = UUID.Zero; |
1038 | UUID.TryParse(id, out keyID); | 996 | UUID.TryParse(id, out keyID); |
1039 | 997 | ||
1040 | AsyncCommands.SensorRepeatPlugin.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); | 998 | AsyncCommands.SensorRepeatPlugin.SenseOnce(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, m_host); |
1041 | } | 999 | } |
1042 | 1000 | ||
1043 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | 1001 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) |
@@ -1046,13 +1004,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1046 | UUID keyID = UUID.Zero; | 1004 | UUID keyID = UUID.Zero; |
1047 | UUID.TryParse(id, out keyID); | 1005 | UUID.TryParse(id, out keyID); |
1048 | 1006 | ||
1049 | AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); | 1007 | AsyncCommands.SensorRepeatPlugin.SetSenseRepeatEvent(m_host.LocalId, m_item.ItemID, name, keyID, type, range, arc, rate, m_host); |
1050 | } | 1008 | } |
1051 | 1009 | ||
1052 | public void llSensorRemove() | 1010 | public void llSensorRemove() |
1053 | { | 1011 | { |
1054 | m_host.AddScriptLPS(1); | 1012 | m_host.AddScriptLPS(1); |
1055 | AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_localID, m_itemID); | 1013 | AsyncCommands.SensorRepeatPlugin.UnSetSenseRepeaterEvents(m_host.LocalId, m_item.ItemID); |
1056 | } | 1014 | } |
1057 | 1015 | ||
1058 | public string resolveName(UUID objecUUID) | 1016 | public string resolveName(UUID objecUUID) |
@@ -1093,7 +1051,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1093 | public LSL_String llDetectedName(int number) | 1051 | public LSL_String llDetectedName(int number) |
1094 | { | 1052 | { |
1095 | m_host.AddScriptLPS(1); | 1053 | m_host.AddScriptLPS(1); |
1096 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1054 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1097 | if (detectedParams == null) | 1055 | if (detectedParams == null) |
1098 | return String.Empty; | 1056 | return String.Empty; |
1099 | return detectedParams.Name; | 1057 | return detectedParams.Name; |
@@ -1102,7 +1060,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1102 | public LSL_String llDetectedKey(int number) | 1060 | public LSL_String llDetectedKey(int number) |
1103 | { | 1061 | { |
1104 | m_host.AddScriptLPS(1); | 1062 | m_host.AddScriptLPS(1); |
1105 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1063 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1106 | if (detectedParams == null) | 1064 | if (detectedParams == null) |
1107 | return String.Empty; | 1065 | return String.Empty; |
1108 | return detectedParams.Key.ToString(); | 1066 | return detectedParams.Key.ToString(); |
@@ -1111,7 +1069,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1111 | public LSL_String llDetectedOwner(int number) | 1069 | public LSL_String llDetectedOwner(int number) |
1112 | { | 1070 | { |
1113 | m_host.AddScriptLPS(1); | 1071 | m_host.AddScriptLPS(1); |
1114 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1072 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1115 | if (detectedParams == null) | 1073 | if (detectedParams == null) |
1116 | return String.Empty; | 1074 | return String.Empty; |
1117 | return detectedParams.Owner.ToString(); | 1075 | return detectedParams.Owner.ToString(); |
@@ -1120,7 +1078,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1120 | public LSL_Integer llDetectedType(int number) | 1078 | public LSL_Integer llDetectedType(int number) |
1121 | { | 1079 | { |
1122 | m_host.AddScriptLPS(1); | 1080 | m_host.AddScriptLPS(1); |
1123 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1081 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1124 | if (detectedParams == null) | 1082 | if (detectedParams == null) |
1125 | return 0; | 1083 | return 0; |
1126 | return new LSL_Integer(detectedParams.Type); | 1084 | return new LSL_Integer(detectedParams.Type); |
@@ -1129,7 +1087,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1129 | public LSL_Vector llDetectedPos(int number) | 1087 | public LSL_Vector llDetectedPos(int number) |
1130 | { | 1088 | { |
1131 | m_host.AddScriptLPS(1); | 1089 | m_host.AddScriptLPS(1); |
1132 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1090 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1133 | if (detectedParams == null) | 1091 | if (detectedParams == null) |
1134 | return new LSL_Vector(); | 1092 | return new LSL_Vector(); |
1135 | return detectedParams.Position; | 1093 | return detectedParams.Position; |
@@ -1138,7 +1096,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1138 | public LSL_Vector llDetectedVel(int number) | 1096 | public LSL_Vector llDetectedVel(int number) |
1139 | { | 1097 | { |
1140 | m_host.AddScriptLPS(1); | 1098 | m_host.AddScriptLPS(1); |
1141 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1099 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1142 | if (detectedParams == null) | 1100 | if (detectedParams == null) |
1143 | return new LSL_Vector(); | 1101 | return new LSL_Vector(); |
1144 | return detectedParams.Velocity; | 1102 | return detectedParams.Velocity; |
@@ -1147,7 +1105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1147 | public LSL_Vector llDetectedGrab(int number) | 1105 | public LSL_Vector llDetectedGrab(int number) |
1148 | { | 1106 | { |
1149 | m_host.AddScriptLPS(1); | 1107 | m_host.AddScriptLPS(1); |
1150 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1108 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1151 | if (parms == null) | 1109 | if (parms == null) |
1152 | return new LSL_Vector(0, 0, 0); | 1110 | return new LSL_Vector(0, 0, 0); |
1153 | 1111 | ||
@@ -1157,7 +1115,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1157 | public LSL_Rotation llDetectedRot(int number) | 1115 | public LSL_Rotation llDetectedRot(int number) |
1158 | { | 1116 | { |
1159 | m_host.AddScriptLPS(1); | 1117 | m_host.AddScriptLPS(1); |
1160 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1118 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1161 | if (detectedParams == null) | 1119 | if (detectedParams == null) |
1162 | return new LSL_Rotation(); | 1120 | return new LSL_Rotation(); |
1163 | return detectedParams.Rotation; | 1121 | return detectedParams.Rotation; |
@@ -1166,7 +1124,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1166 | public LSL_Integer llDetectedGroup(int number) | 1124 | public LSL_Integer llDetectedGroup(int number) |
1167 | { | 1125 | { |
1168 | m_host.AddScriptLPS(1); | 1126 | m_host.AddScriptLPS(1); |
1169 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1127 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1170 | if (detectedParams == null) | 1128 | if (detectedParams == null) |
1171 | return new LSL_Integer(0); | 1129 | return new LSL_Integer(0); |
1172 | if (m_host.GroupID == detectedParams.Group) | 1130 | if (m_host.GroupID == detectedParams.Group) |
@@ -1177,7 +1135,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1177 | public LSL_Integer llDetectedLinkNumber(int number) | 1135 | public LSL_Integer llDetectedLinkNumber(int number) |
1178 | { | 1136 | { |
1179 | m_host.AddScriptLPS(1); | 1137 | m_host.AddScriptLPS(1); |
1180 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); | 1138 | DetectParams parms = m_ScriptEngine.GetDetectParams(m_item.ItemID, number); |
1181 | if (parms == null) | 1139 | if (parms == null) |
1182 | return new LSL_Integer(0); | 1140 | return new LSL_Integer(0); |
1183 | 1141 | ||
@@ -1190,7 +1148,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1190 | public LSL_Vector llDetectedTouchBinormal(int index) | 1148 | public LSL_Vector llDetectedTouchBinormal(int index) |
1191 | { | 1149 | { |
1192 | m_host.AddScriptLPS(1); | 1150 | m_host.AddScriptLPS(1); |
1193 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1151 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1194 | if (detectedParams == null) | 1152 | if (detectedParams == null) |
1195 | return new LSL_Vector(); | 1153 | return new LSL_Vector(); |
1196 | return detectedParams.TouchBinormal; | 1154 | return detectedParams.TouchBinormal; |
@@ -1202,7 +1160,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1202 | public LSL_Integer llDetectedTouchFace(int index) | 1160 | public LSL_Integer llDetectedTouchFace(int index) |
1203 | { | 1161 | { |
1204 | m_host.AddScriptLPS(1); | 1162 | m_host.AddScriptLPS(1); |
1205 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1163 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1206 | if (detectedParams == null) | 1164 | if (detectedParams == null) |
1207 | return new LSL_Integer(-1); | 1165 | return new LSL_Integer(-1); |
1208 | return new LSL_Integer(detectedParams.TouchFace); | 1166 | return new LSL_Integer(detectedParams.TouchFace); |
@@ -1214,7 +1172,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1214 | public LSL_Vector llDetectedTouchNormal(int index) | 1172 | public LSL_Vector llDetectedTouchNormal(int index) |
1215 | { | 1173 | { |
1216 | m_host.AddScriptLPS(1); | 1174 | m_host.AddScriptLPS(1); |
1217 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1175 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1218 | if (detectedParams == null) | 1176 | if (detectedParams == null) |
1219 | return new LSL_Vector(); | 1177 | return new LSL_Vector(); |
1220 | return detectedParams.TouchNormal; | 1178 | return detectedParams.TouchNormal; |
@@ -1226,7 +1184,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1226 | public LSL_Vector llDetectedTouchPos(int index) | 1184 | public LSL_Vector llDetectedTouchPos(int index) |
1227 | { | 1185 | { |
1228 | m_host.AddScriptLPS(1); | 1186 | m_host.AddScriptLPS(1); |
1229 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1187 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1230 | if (detectedParams == null) | 1188 | if (detectedParams == null) |
1231 | return new LSL_Vector(); | 1189 | return new LSL_Vector(); |
1232 | return detectedParams.TouchPos; | 1190 | return detectedParams.TouchPos; |
@@ -1238,7 +1196,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1238 | public LSL_Vector llDetectedTouchST(int index) | 1196 | public LSL_Vector llDetectedTouchST(int index) |
1239 | { | 1197 | { |
1240 | m_host.AddScriptLPS(1); | 1198 | m_host.AddScriptLPS(1); |
1241 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1199 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1242 | if (detectedParams == null) | 1200 | if (detectedParams == null) |
1243 | return new LSL_Vector(-1.0, -1.0, 0.0); | 1201 | return new LSL_Vector(-1.0, -1.0, 0.0); |
1244 | return detectedParams.TouchST; | 1202 | return detectedParams.TouchST; |
@@ -1250,7 +1208,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1250 | public LSL_Vector llDetectedTouchUV(int index) | 1208 | public LSL_Vector llDetectedTouchUV(int index) |
1251 | { | 1209 | { |
1252 | m_host.AddScriptLPS(1); | 1210 | m_host.AddScriptLPS(1); |
1253 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, index); | 1211 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, index); |
1254 | if (detectedParams == null) | 1212 | if (detectedParams == null) |
1255 | return new LSL_Vector(-1.0, -1.0, 0.0); | 1213 | return new LSL_Vector(-1.0, -1.0, 0.0); |
1256 | return detectedParams.TouchUV; | 1214 | return detectedParams.TouchUV; |
@@ -1962,6 +1920,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1962 | rgb.x = texcolor.R; | 1920 | rgb.x = texcolor.R; |
1963 | rgb.y = texcolor.G; | 1921 | rgb.y = texcolor.G; |
1964 | rgb.z = texcolor.B; | 1922 | rgb.z = texcolor.B; |
1923 | |||
1965 | return rgb; | 1924 | return rgb; |
1966 | } | 1925 | } |
1967 | else | 1926 | else |
@@ -3039,20 +2998,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3039 | 2998 | ||
3040 | public LSL_Integer llGiveMoney(string destination, int amount) | 2999 | public LSL_Integer llGiveMoney(string destination, int amount) |
3041 | { | 3000 | { |
3042 | UUID invItemID=InventorySelf(); | ||
3043 | if (invItemID == UUID.Zero) | ||
3044 | return 0; | ||
3045 | |||
3046 | m_host.AddScriptLPS(1); | 3001 | m_host.AddScriptLPS(1); |
3047 | 3002 | ||
3048 | m_host.TaskInventory.LockItemsForRead(true); | 3003 | if (m_item.PermsGranter == UUID.Zero) |
3049 | TaskInventoryItem item = m_host.TaskInventory[invItemID]; | ||
3050 | m_host.TaskInventory.LockItemsForRead(false); | ||
3051 | |||
3052 | if (item.PermsGranter == UUID.Zero) | ||
3053 | return 0; | 3004 | return 0; |
3054 | 3005 | ||
3055 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) | 3006 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_DEBIT) == 0) |
3056 | { | 3007 | { |
3057 | LSLError("No permissions to give money"); | 3008 | LSLError("No permissions to give money"); |
3058 | return 0; | 3009 | return 0; |
@@ -3115,74 +3066,72 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3115 | { | 3066 | { |
3116 | m_host.AddScriptLPS(1); | 3067 | m_host.AddScriptLPS(1); |
3117 | 3068 | ||
3118 | Util.FireAndForget(delegate (object x) | 3069 | Util.FireAndForget(x => |
3119 | { | 3070 | { |
3120 | if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s)) | 3071 | if (Double.IsNaN(rot.x) || Double.IsNaN(rot.y) || Double.IsNaN(rot.z) || Double.IsNaN(rot.s)) |
3121 | return; | 3072 | return; |
3073 | |||
3122 | float dist = (float)llVecDist(llGetPos(), pos); | 3074 | float dist = (float)llVecDist(llGetPos(), pos); |
3123 | 3075 | ||
3124 | if (dist > m_ScriptDistanceFactor * 10.0f) | 3076 | if (dist > m_ScriptDistanceFactor * 10.0f) |
3125 | return; | 3077 | return; |
3126 | 3078 | ||
3127 | //Clone is thread-safe | 3079 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory); |
3128 | TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); | ||
3129 | 3080 | ||
3130 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory) | 3081 | if (item == null) |
3131 | { | 3082 | { |
3132 | if (inv.Value.Name == inventory) | 3083 | llSay(0, "Could not find object " + inventory); |
3133 | { | 3084 | return; |
3134 | // make sure we're an object. | 3085 | } |
3135 | if (inv.Value.InvType != (int)InventoryType.Object) | ||
3136 | { | ||
3137 | llSay(0, "Unable to create requested object. Object is missing from database."); | ||
3138 | return; | ||
3139 | } | ||
3140 | 3086 | ||
3141 | Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); | 3087 | if (item.InvType != (int)InventoryType.Object) |
3142 | Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z); | 3088 | { |
3089 | llSay(0, "Unable to create requested object. Object is missing from database."); | ||
3090 | return; | ||
3091 | } | ||
3143 | 3092 | ||
3144 | // need the magnitude later | 3093 | Vector3 llpos = new Vector3((float)pos.x, (float)pos.y, (float)pos.z); |
3145 | // float velmag = (float)Util.GetMagnitude(llvel); | 3094 | Vector3 llvel = new Vector3((float)vel.x, (float)vel.y, (float)vel.z); |
3146 | 3095 | ||
3147 | SceneObjectGroup new_group = World.RezObject(m_host, inv.Value, llpos, Rot2Quaternion(rot), llvel, param); | 3096 | // need the magnitude later |
3097 | // float velmag = (float)Util.GetMagnitude(llvel); | ||
3148 | 3098 | ||
3149 | // If either of these are null, then there was an unknown error. | 3099 | SceneObjectGroup new_group = World.RezObject(m_host, item, llpos, Rot2Quaternion(rot), llvel, param); |
3150 | if (new_group == null) | ||
3151 | continue; | ||
3152 | 3100 | ||
3153 | // objects rezzed with this method are die_at_edge by default. | 3101 | // If either of these are null, then there was an unknown error. |
3154 | new_group.RootPart.SetDieAtEdge(true); | 3102 | if (new_group == null) |
3103 | return; | ||
3155 | 3104 | ||
3156 | new_group.ResumeScripts(); | 3105 | // objects rezzed with this method are die_at_edge by default. |
3106 | new_group.RootPart.SetDieAtEdge(true); | ||
3157 | 3107 | ||
3158 | m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( | 3108 | new_group.ResumeScripts(); |
3159 | "object_rez", new Object[] { | ||
3160 | new LSL_String( | ||
3161 | new_group.RootPart.UUID.ToString()) }, | ||
3162 | new DetectParams[0])); | ||
3163 | 3109 | ||
3164 | // do recoil | 3110 | m_ScriptEngine.PostObjectEvent(m_host.LocalId, new EventParams( |
3165 | SceneObjectGroup hostgrp = m_host.ParentGroup; | 3111 | "object_rez", new Object[] { |
3166 | if (hostgrp == null) | 3112 | new LSL_String( |
3167 | return; | 3113 | new_group.RootPart.UUID.ToString()) }, |
3114 | new DetectParams[0])); | ||
3168 | 3115 | ||
3169 | if (hostgrp.IsAttachment) // don't recoil avatars | 3116 | // do recoil |
3170 | return; | 3117 | SceneObjectGroup hostgrp = m_host.ParentGroup; |
3118 | if (hostgrp == null) | ||
3119 | return; | ||
3171 | 3120 | ||
3172 | PhysicsActor pa = new_group.RootPart.PhysActor; | 3121 | if (hostgrp.IsAttachment) // don't recoil avatars |
3122 | return; | ||
3173 | 3123 | ||
3174 | if (pa != null && pa.IsPhysical && llvel != Vector3.Zero) | 3124 | PhysicsActor pa = new_group.RootPart.PhysActor; |
3175 | { | 3125 | |
3176 | float groupmass = new_group.GetMass(); | 3126 | if (pa != null && pa.IsPhysical && llvel != Vector3.Zero) |
3177 | llvel *= -groupmass; | 3127 | { |
3178 | llApplyImpulse(new LSL_Vector(llvel.X, llvel.Y,llvel.Z), 0); | 3128 | float groupmass = new_group.GetMass(); |
3179 | } | 3129 | llvel *= -groupmass; |
3180 | // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) | 3130 | llApplyImpulse(new LSL_Vector(llvel.X, llvel.Y,llvel.Z), 0); |
3181 | return; | ||
3182 | } | ||
3183 | } | 3131 | } |
3132 | // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) | ||
3133 | return; | ||
3184 | 3134 | ||
3185 | llSay(0, "Could not find object " + inventory); | ||
3186 | }); | 3135 | }); |
3187 | 3136 | ||
3188 | //ScriptSleep((int)((groupmass * velmag) / 10)); | 3137 | //ScriptSleep((int)((groupmass * velmag) / 10)); |
@@ -3246,11 +3195,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3246 | sec = m_MinTimerInterval; | 3195 | sec = m_MinTimerInterval; |
3247 | m_host.AddScriptLPS(1); | 3196 | m_host.AddScriptLPS(1); |
3248 | // Setting timer repeat | 3197 | // Setting timer repeat |
3249 | AsyncCommands.TimerPlugin.SetTimerEvent(m_localID, m_itemID, sec); | 3198 | AsyncCommands.TimerPlugin.SetTimerEvent(m_host.LocalId, m_item.ItemID, sec); |
3250 | } | 3199 | } |
3251 | 3200 | ||
3252 | public virtual void llSleep(double sec) | 3201 | public virtual void llSleep(double sec) |
3253 | { | 3202 | { |
3203 | // m_log.Info("llSleep snoozing " + sec + "s."); | ||
3254 | m_host.AddScriptLPS(1); | 3204 | m_host.AddScriptLPS(1); |
3255 | Thread.Sleep((int)(sec * 1000)); | 3205 | Thread.Sleep((int)(sec * 1000)); |
3256 | } | 3206 | } |
@@ -3309,29 +3259,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3309 | 3259 | ||
3310 | public void llTakeControls(int controls, int accept, int pass_on) | 3260 | public void llTakeControls(int controls, int accept, int pass_on) |
3311 | { | 3261 | { |
3312 | TaskInventoryItem item; | 3262 | if (m_item.PermsGranter != UUID.Zero) |
3313 | |||
3314 | m_host.TaskInventory.LockItemsForRead(true); | ||
3315 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3316 | { | ||
3317 | m_host.TaskInventory.LockItemsForRead(false); | ||
3318 | return; | ||
3319 | } | ||
3320 | else | ||
3321 | { | ||
3322 | item = m_host.TaskInventory[InventorySelf()]; | ||
3323 | } | ||
3324 | m_host.TaskInventory.LockItemsForRead(false); | ||
3325 | |||
3326 | if (item.PermsGranter != UUID.Zero) | ||
3327 | { | 3263 | { |
3328 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | 3264 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
3329 | 3265 | ||
3330 | if (presence != null) | 3266 | if (presence != null) |
3331 | { | 3267 | { |
3332 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) | 3268 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) |
3333 | { | 3269 | { |
3334 | presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); | 3270 | presence.RegisterControlEventsToScript(controls, accept, pass_on, m_host.LocalId, m_item.ItemID); |
3335 | } | 3271 | } |
3336 | } | 3272 | } |
3337 | } | 3273 | } |
@@ -3341,38 +3277,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3341 | 3277 | ||
3342 | public void llReleaseControls() | 3278 | public void llReleaseControls() |
3343 | { | 3279 | { |
3344 | TaskInventoryItem item; | ||
3345 | |||
3346 | m_host.TaskInventory.LockItemsForRead(true); | ||
3347 | lock (m_host.TaskInventory) | ||
3348 | { | ||
3349 | |||
3350 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3351 | { | ||
3352 | m_host.TaskInventory.LockItemsForRead(false); | ||
3353 | return; | ||
3354 | } | ||
3355 | else | ||
3356 | { | ||
3357 | item = m_host.TaskInventory[InventorySelf()]; | ||
3358 | } | ||
3359 | } | ||
3360 | m_host.TaskInventory.LockItemsForRead(false); | ||
3361 | |||
3362 | m_host.AddScriptLPS(1); | 3280 | m_host.AddScriptLPS(1); |
3363 | 3281 | ||
3364 | if (item.PermsGranter != UUID.Zero) | 3282 | if (m_item.PermsGranter != UUID.Zero) |
3365 | { | 3283 | { |
3366 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | 3284 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
3367 | 3285 | ||
3368 | if (presence != null) | 3286 | if (presence != null) |
3369 | { | 3287 | { |
3370 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) | 3288 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) |
3371 | { | 3289 | { |
3372 | // Unregister controls from Presence | 3290 | // Unregister controls from Presence |
3373 | presence.UnRegisterControlEventsToScript(m_localID, m_itemID); | 3291 | presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID); |
3374 | // Remove Take Control permission. | 3292 | // Remove Take Control permission. |
3375 | item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; | 3293 | m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS; |
3376 | } | 3294 | } |
3377 | } | 3295 | } |
3378 | } | 3296 | } |
@@ -3385,39 +3303,54 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3385 | m_UrlModule.ReleaseURL(url); | 3303 | m_UrlModule.ReleaseURL(url); |
3386 | } | 3304 | } |
3387 | 3305 | ||
3388 | public void llAttachToAvatar(int attachment) | 3306 | /// <summary> |
3307 | /// Attach the object containing this script to the avatar that owns it. | ||
3308 | /// </summary> | ||
3309 | /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param> | ||
3310 | /// <returns>true if the attach suceeded, false if it did not</returns> | ||
3311 | public bool AttachToAvatar(int attachmentPoint) | ||
3389 | { | 3312 | { |
3390 | m_host.AddScriptLPS(1); | 3313 | SceneObjectGroup grp = m_host.ParentGroup; |
3314 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | ||
3391 | 3315 | ||
3392 | TaskInventoryItem item; | 3316 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; |
3393 | |||
3394 | m_host.TaskInventory.LockItemsForRead(true); | ||
3395 | 3317 | ||
3396 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | 3318 | if (attachmentsModule != null) |
3397 | { | 3319 | return attachmentsModule.AttachObject(presence, grp, (uint)attachmentPoint, false, true); |
3398 | m_host.TaskInventory.LockItemsForRead(false); | ||
3399 | return; | ||
3400 | } | ||
3401 | else | 3320 | else |
3321 | return false; | ||
3322 | } | ||
3323 | |||
3324 | /// <summary> | ||
3325 | /// Detach the object containing this script from the avatar it is attached to. | ||
3326 | /// </summary> | ||
3327 | /// <remarks> | ||
3328 | /// Nothing happens if the object is not attached. | ||
3329 | /// </remarks> | ||
3330 | public void DetachFromAvatar() | ||
3331 | { | ||
3332 | Util.FireAndForget(DetachWrapper, m_host); | ||
3333 | } | ||
3334 | |||
3335 | private void DetachWrapper(object o) | ||
3336 | { | ||
3337 | if (World.AttachmentsModule != null) | ||
3402 | { | 3338 | { |
3403 | item = m_host.TaskInventory[InventorySelf()]; | 3339 | SceneObjectPart host = (SceneObjectPart)o; |
3340 | ScenePresence presence = World.GetScenePresence(host.OwnerID); | ||
3341 | World.AttachmentsModule.DetachSingleAttachmentToInv(presence, host.ParentGroup); | ||
3404 | } | 3342 | } |
3343 | } | ||
3405 | 3344 | ||
3406 | m_host.TaskInventory.LockItemsForRead(false); | 3345 | public void llAttachToAvatar(int attachmentPoint) |
3346 | { | ||
3347 | m_host.AddScriptLPS(1); | ||
3407 | 3348 | ||
3408 | if (item.PermsGranter != m_host.OwnerID) | 3349 | if (m_item.PermsGranter != m_host.OwnerID) |
3409 | return; | 3350 | return; |
3410 | 3351 | ||
3411 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) | 3352 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) |
3412 | { | 3353 | AttachToAvatar(attachmentPoint); |
3413 | SceneObjectGroup grp = m_host.ParentGroup; | ||
3414 | |||
3415 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | ||
3416 | |||
3417 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3418 | if (attachmentsModule != null) | ||
3419 | attachmentsModule.AttachObject(presence, grp, (uint)attachment, false, true); | ||
3420 | } | ||
3421 | } | 3354 | } |
3422 | 3355 | ||
3423 | public void llDetachFromAvatar() | 3356 | public void llDetachFromAvatar() |
@@ -3427,44 +3360,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3427 | if (m_host.ParentGroup.AttachmentPoint == 0) | 3360 | if (m_host.ParentGroup.AttachmentPoint == 0) |
3428 | return; | 3361 | return; |
3429 | 3362 | ||
3430 | TaskInventoryItem item; | 3363 | if (m_item.PermsGranter != m_host.OwnerID) |
3431 | |||
3432 | m_host.TaskInventory.LockItemsForRead(true); | ||
3433 | |||
3434 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3435 | { | ||
3436 | m_host.TaskInventory.LockItemsForRead(false); | ||
3437 | return; | 3364 | return; |
3438 | } | ||
3439 | else | ||
3440 | { | ||
3441 | item = m_host.TaskInventory[InventorySelf()]; | ||
3442 | } | ||
3443 | m_host.TaskInventory.LockItemsForRead(false); | ||
3444 | |||
3445 | |||
3446 | if (item.PermsGranter != m_host.OwnerID) | ||
3447 | return; | ||
3448 | |||
3449 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) | ||
3450 | { | ||
3451 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3452 | if (attachmentsModule != null) | ||
3453 | Util.FireAndForget(DetachWrapper, m_host); | ||
3454 | } | ||
3455 | } | ||
3456 | 3365 | ||
3457 | private void DetachWrapper(object o) | 3366 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_ATTACH) != 0) |
3458 | { | 3367 | DetachFromAvatar(); |
3459 | SceneObjectPart host = (SceneObjectPart)o; | ||
3460 | |||
3461 | SceneObjectGroup grp = host.ParentGroup; | ||
3462 | UUID itemID = grp.FromItemID; | ||
3463 | ScenePresence presence = World.GetScenePresence(host.OwnerID); | ||
3464 | |||
3465 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3466 | if (attachmentsModule != null) | ||
3467 | attachmentsModule.DetachSingleAttachmentToInv(presence, itemID); | ||
3468 | } | 3368 | } |
3469 | 3369 | ||
3470 | public void llTakeCamera(string avatar) | 3370 | public void llTakeCamera(string avatar) |
@@ -3585,7 +3485,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3585 | } | 3485 | } |
3586 | 3486 | ||
3587 | emailModule.SendEmail(m_host.UUID, address, subject, message); | 3487 | emailModule.SendEmail(m_host.UUID, address, subject, message); |
3588 | ScriptSleep(15000); | 3488 | ScriptSleep(EMAIL_PAUSE_TIME * 1000); |
3589 | } | 3489 | } |
3590 | 3490 | ||
3591 | public void llGetNextEmail(string address, string subject) | 3491 | public void llGetNextEmail(string address, string subject) |
@@ -3622,6 +3522,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3622 | return m_host.UUID.ToString(); | 3522 | return m_host.UUID.ToString(); |
3623 | } | 3523 | } |
3624 | 3524 | ||
3525 | public LSL_Key llGenerateKey() | ||
3526 | { | ||
3527 | m_host.AddScriptLPS(1); | ||
3528 | return UUID.Random().ToString(); | ||
3529 | } | ||
3530 | |||
3625 | public void llSetBuoyancy(double buoyancy) | 3531 | public void llSetBuoyancy(double buoyancy) |
3626 | { | 3532 | { |
3627 | m_host.AddScriptLPS(1); | 3533 | m_host.AddScriptLPS(1); |
@@ -3668,7 +3574,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3668 | m_host.AddScriptLPS(1); | 3574 | m_host.AddScriptLPS(1); |
3669 | try | 3575 | try |
3670 | { | 3576 | { |
3671 | m_ScriptEngine.SetMinEventDelay(m_itemID, delay); | 3577 | m_ScriptEngine.SetMinEventDelay(m_item.ItemID, delay); |
3672 | } | 3578 | } |
3673 | catch (NotImplementedException) | 3579 | catch (NotImplementedException) |
3674 | { | 3580 | { |
@@ -3721,29 +3627,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3721 | { | 3627 | { |
3722 | m_host.AddScriptLPS(1); | 3628 | m_host.AddScriptLPS(1); |
3723 | 3629 | ||
3724 | UUID invItemID = InventorySelf(); | 3630 | if (m_item.PermsGranter == UUID.Zero) |
3725 | if (invItemID == UUID.Zero) | ||
3726 | return; | 3631 | return; |
3727 | 3632 | ||
3728 | TaskInventoryItem item; | 3633 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) |
3729 | |||
3730 | m_host.TaskInventory.LockItemsForRead(true); | ||
3731 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3732 | { | ||
3733 | m_host.TaskInventory.LockItemsForRead(false); | ||
3734 | return; | ||
3735 | } | ||
3736 | else | ||
3737 | { | 3634 | { |
3738 | item = m_host.TaskInventory[InventorySelf()]; | 3635 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
3739 | } | ||
3740 | m_host.TaskInventory.LockItemsForRead(false); | ||
3741 | if (item.PermsGranter == UUID.Zero) | ||
3742 | return; | ||
3743 | |||
3744 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) | ||
3745 | { | ||
3746 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | ||
3747 | 3636 | ||
3748 | if (presence != null) | 3637 | if (presence != null) |
3749 | { | 3638 | { |
@@ -3761,41 +3650,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3761 | { | 3650 | { |
3762 | m_host.AddScriptLPS(1); | 3651 | m_host.AddScriptLPS(1); |
3763 | 3652 | ||
3764 | UUID invItemID=InventorySelf(); | 3653 | if (m_item.PermsGranter == UUID.Zero) |
3765 | if (invItemID == UUID.Zero) | ||
3766 | return; | ||
3767 | |||
3768 | TaskInventoryItem item; | ||
3769 | |||
3770 | m_host.TaskInventory.LockItemsForRead(true); | ||
3771 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
3772 | { | ||
3773 | m_host.TaskInventory.LockItemsForRead(false); | ||
3774 | return; | ||
3775 | } | ||
3776 | else | ||
3777 | { | ||
3778 | item = m_host.TaskInventory[InventorySelf()]; | ||
3779 | } | ||
3780 | m_host.TaskInventory.LockItemsForRead(false); | ||
3781 | |||
3782 | |||
3783 | if (item.PermsGranter == UUID.Zero) | ||
3784 | return; | 3654 | return; |
3785 | 3655 | ||
3786 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) | 3656 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) |
3787 | { | 3657 | { |
3788 | UUID animID = new UUID(); | 3658 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
3789 | |||
3790 | if (!UUID.TryParse(anim, out animID)) | ||
3791 | { | ||
3792 | animID=InventoryKey(anim); | ||
3793 | } | ||
3794 | |||
3795 | ScenePresence presence = World.GetScenePresence(item.PermsGranter); | ||
3796 | 3659 | ||
3797 | if (presence != null) | 3660 | if (presence != null) |
3798 | { | 3661 | { |
3662 | UUID animID = KeyOrName(anim); | ||
3663 | |||
3799 | if (animID == UUID.Zero) | 3664 | if (animID == UUID.Zero) |
3800 | presence.Animator.RemoveAnimation(anim); | 3665 | presence.Animator.RemoveAnimation(anim); |
3801 | else | 3666 | else |
@@ -3829,44 +3694,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3829 | public LSL_Integer llGetStartParameter() | 3694 | public LSL_Integer llGetStartParameter() |
3830 | { | 3695 | { |
3831 | m_host.AddScriptLPS(1); | 3696 | m_host.AddScriptLPS(1); |
3832 | return m_ScriptEngine.GetStartParameter(m_itemID); | 3697 | return m_ScriptEngine.GetStartParameter(m_item.ItemID); |
3833 | } | 3698 | } |
3834 | 3699 | ||
3835 | public void llRequestPermissions(string agent, int perm) | 3700 | public void llRequestPermissions(string agent, int perm) |
3836 | { | 3701 | { |
3837 | UUID agentID = new UUID(); | 3702 | UUID agentID; |
3838 | 3703 | ||
3839 | if (!UUID.TryParse(agent, out agentID)) | 3704 | if (!UUID.TryParse(agent, out agentID)) |
3840 | return; | 3705 | return; |
3841 | 3706 | ||
3842 | UUID invItemID = InventorySelf(); | ||
3843 | |||
3844 | if (invItemID == UUID.Zero) | ||
3845 | return; // Not in a prim? How?? | ||
3846 | |||
3847 | TaskInventoryItem item; | ||
3848 | |||
3849 | |||
3850 | m_host.TaskInventory.LockItemsForRead(true); | ||
3851 | if (!m_host.TaskInventory.ContainsKey(invItemID)) | ||
3852 | { | ||
3853 | m_host.TaskInventory.LockItemsForRead(false); | ||
3854 | return; | ||
3855 | } | ||
3856 | else | ||
3857 | { | ||
3858 | item = m_host.TaskInventory[invItemID]; | ||
3859 | } | ||
3860 | m_host.TaskInventory.LockItemsForRead(false); | ||
3861 | |||
3862 | if (agentID == UUID.Zero || perm == 0) // Releasing permissions | 3707 | if (agentID == UUID.Zero || perm == 0) // Releasing permissions |
3863 | { | 3708 | { |
3864 | llReleaseControls(); | 3709 | llReleaseControls(); |
3865 | 3710 | ||
3866 | item.PermsGranter = UUID.Zero; | 3711 | m_item.PermsGranter = UUID.Zero; |
3867 | item.PermsMask = 0; | 3712 | m_item.PermsMask = 0; |
3868 | 3713 | ||
3869 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3714 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( |
3870 | "run_time_permissions", new Object[] { | 3715 | "run_time_permissions", new Object[] { |
3871 | new LSL_Integer(0) }, | 3716 | new LSL_Integer(0) }, |
3872 | new DetectParams[0])); | 3717 | new DetectParams[0])); |
@@ -3874,7 +3719,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3874 | return; | 3719 | return; |
3875 | } | 3720 | } |
3876 | 3721 | ||
3877 | if (item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) | 3722 | if (m_item.PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) |
3878 | llReleaseControls(); | 3723 | llReleaseControls(); |
3879 | 3724 | ||
3880 | m_host.AddScriptLPS(1); | 3725 | m_host.AddScriptLPS(1); |
@@ -3891,11 +3736,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3891 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms | 3736 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms |
3892 | { | 3737 | { |
3893 | m_host.TaskInventory.LockItemsForWrite(true); | 3738 | m_host.TaskInventory.LockItemsForWrite(true); |
3894 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3739 | m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; |
3895 | m_host.TaskInventory[invItemID].PermsMask = perm; | 3740 | m_host.TaskInventory[m_item.ItemID].PermsMask = perm; |
3896 | m_host.TaskInventory.LockItemsForWrite(false); | 3741 | m_host.TaskInventory.LockItemsForWrite(false); |
3897 | 3742 | ||
3898 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3743 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( |
3899 | "run_time_permissions", new Object[] { | 3744 | "run_time_permissions", new Object[] { |
3900 | new LSL_Integer(perm) }, | 3745 | new LSL_Integer(perm) }, |
3901 | new DetectParams[0])); | 3746 | new DetectParams[0])); |
@@ -3930,11 +3775,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3930 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms | 3775 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms |
3931 | { | 3776 | { |
3932 | m_host.TaskInventory.LockItemsForWrite(true); | 3777 | m_host.TaskInventory.LockItemsForWrite(true); |
3933 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3778 | m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; |
3934 | m_host.TaskInventory[invItemID].PermsMask = perm; | 3779 | m_host.TaskInventory[m_item.ItemID].PermsMask = perm; |
3935 | m_host.TaskInventory.LockItemsForWrite(false); | 3780 | m_host.TaskInventory.LockItemsForWrite(false); |
3936 | 3781 | ||
3937 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3782 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( |
3938 | "run_time_permissions", new Object[] { | 3783 | "run_time_permissions", new Object[] { |
3939 | new LSL_Integer(perm) }, | 3784 | new LSL_Integer(perm) }, |
3940 | new DetectParams[0])); | 3785 | new DetectParams[0])); |
@@ -3945,9 +3790,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3945 | } | 3790 | } |
3946 | 3791 | ||
3947 | ScenePresence presence = World.GetScenePresence(agentID); | 3792 | ScenePresence presence = World.GetScenePresence(agentID); |
3948 | |||
3949 | if (presence != null) | 3793 | if (presence != null) |
3950 | { | 3794 | { |
3795 | // If permissions are being requested from an NPC and were not implicitly granted above then | ||
3796 | // auto grant all reuqested permissions if the script is owned by the NPC or the NPCs owner | ||
3797 | INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); | ||
3798 | if (npcModule != null && npcModule.IsNPC(agentID, World)) | ||
3799 | { | ||
3800 | if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID) | ||
3801 | { | ||
3802 | lock (m_host.TaskInventory) | ||
3803 | { | ||
3804 | m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; | ||
3805 | m_host.TaskInventory[m_item.ItemID].PermsMask = perm; | ||
3806 | } | ||
3807 | |||
3808 | m_ScriptEngine.PostScriptEvent( | ||
3809 | m_item.ItemID, | ||
3810 | new EventParams( | ||
3811 | "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0])); | ||
3812 | } | ||
3813 | |||
3814 | // it is an NPC, exit even if the permissions werent granted above, they are not going to answer | ||
3815 | // the question! | ||
3816 | return; | ||
3817 | } | ||
3818 | |||
3951 | string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); | 3819 | string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); |
3952 | if (ownerName == String.Empty) | 3820 | if (ownerName == String.Empty) |
3953 | ownerName = "(hippos)"; | 3821 | ownerName = "(hippos)"; |
@@ -3955,8 +3823,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3955 | if (!m_waitingForScriptAnswer) | 3823 | if (!m_waitingForScriptAnswer) |
3956 | { | 3824 | { |
3957 | m_host.TaskInventory.LockItemsForWrite(true); | 3825 | m_host.TaskInventory.LockItemsForWrite(true); |
3958 | m_host.TaskInventory[invItemID].PermsGranter = agentID; | 3826 | m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID; |
3959 | m_host.TaskInventory[invItemID].PermsMask = 0; | 3827 | m_host.TaskInventory[m_item.ItemID].PermsMask = 0; |
3960 | m_host.TaskInventory.LockItemsForWrite(false); | 3828 | m_host.TaskInventory.LockItemsForWrite(false); |
3961 | 3829 | ||
3962 | presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; | 3830 | presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; |
@@ -3964,16 +3832,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3964 | } | 3832 | } |
3965 | 3833 | ||
3966 | presence.ControllingClient.SendScriptQuestion( | 3834 | presence.ControllingClient.SendScriptQuestion( |
3967 | m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); | 3835 | m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, m_item.ItemID, perm); |
3968 | 3836 | ||
3969 | return; | 3837 | return; |
3970 | } | 3838 | } |
3971 | 3839 | ||
3972 | // Requested agent is not in range, refuse perms | 3840 | // Requested agent is not in range, refuse perms |
3973 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 3841 | m_ScriptEngine.PostScriptEvent( |
3974 | "run_time_permissions", new Object[] { | 3842 | m_item.ItemID, |
3975 | new LSL_Integer(0) }, | 3843 | new EventParams("run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0])); |
3976 | new DetectParams[0])); | ||
3977 | } | 3844 | } |
3978 | 3845 | ||
3979 | void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) | 3846 | void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) |
@@ -3981,24 +3848,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3981 | if (taskID != m_host.UUID) | 3848 | if (taskID != m_host.UUID) |
3982 | return; | 3849 | return; |
3983 | 3850 | ||
3984 | UUID invItemID = InventorySelf(); | 3851 | client.OnScriptAnswer -= handleScriptAnswer; |
3985 | 3852 | m_waitingForScriptAnswer = false; | |
3986 | if (invItemID == UUID.Zero) | ||
3987 | return; | ||
3988 | |||
3989 | client.OnScriptAnswer-=handleScriptAnswer; | ||
3990 | m_waitingForScriptAnswer=false; | ||
3991 | 3853 | ||
3992 | if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) | 3854 | if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) |
3993 | llReleaseControls(); | 3855 | llReleaseControls(); |
3994 | 3856 | ||
3995 | |||
3996 | m_host.TaskInventory.LockItemsForWrite(true); | 3857 | m_host.TaskInventory.LockItemsForWrite(true); |
3997 | m_host.TaskInventory[invItemID].PermsMask = answer; | 3858 | m_host.TaskInventory[m_item.ItemID].PermsMask = answer; |
3998 | m_host.TaskInventory.LockItemsForWrite(false); | 3859 | m_host.TaskInventory.LockItemsForWrite(false); |
3999 | 3860 | ||
4000 | 3861 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( | |
4001 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | ||
4002 | "run_time_permissions", new Object[] { | 3862 | "run_time_permissions", new Object[] { |
4003 | new LSL_Integer(answer) }, | 3863 | new LSL_Integer(answer) }, |
4004 | new DetectParams[0])); | 3864 | new DetectParams[0])); |
@@ -4008,41 +3868,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4008 | { | 3868 | { |
4009 | m_host.AddScriptLPS(1); | 3869 | m_host.AddScriptLPS(1); |
4010 | 3870 | ||
4011 | m_host.TaskInventory.LockItemsForRead(true); | 3871 | return m_item.PermsGranter.ToString(); |
4012 | |||
4013 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
4014 | { | ||
4015 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
4016 | { | ||
4017 | m_host.TaskInventory.LockItemsForRead(false); | ||
4018 | return item.PermsGranter.ToString(); | ||
4019 | } | ||
4020 | } | ||
4021 | m_host.TaskInventory.LockItemsForRead(false); | ||
4022 | |||
4023 | return UUID.Zero.ToString(); | ||
4024 | } | 3872 | } |
4025 | 3873 | ||
4026 | public LSL_Integer llGetPermissions() | 3874 | public LSL_Integer llGetPermissions() |
4027 | { | 3875 | { |
4028 | m_host.AddScriptLPS(1); | 3876 | m_host.AddScriptLPS(1); |
4029 | 3877 | ||
4030 | m_host.TaskInventory.LockItemsForRead(true); | 3878 | int perms = m_item.PermsMask; |
4031 | 3879 | ||
4032 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | 3880 | if (m_automaticLinkPermission) |
4033 | { | 3881 | perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; |
4034 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
4035 | { | ||
4036 | int perms = item.PermsMask; | ||
4037 | if (m_automaticLinkPermission) | ||
4038 | perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; | ||
4039 | m_host.TaskInventory.LockItemsForRead(false); | ||
4040 | return perms; | ||
4041 | } | ||
4042 | } | ||
4043 | m_host.TaskInventory.LockItemsForRead(false); | ||
4044 | 3882 | ||
4045 | return 0; | 3883 | return perms; |
4046 | } | 3884 | } |
4047 | 3885 | ||
4048 | public LSL_Integer llGetLinkNumber() | 3886 | public LSL_Integer llGetLinkNumber() |
@@ -4080,18 +3918,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4080 | public void llCreateLink(string target, int parent) | 3918 | public void llCreateLink(string target, int parent) |
4081 | { | 3919 | { |
4082 | m_host.AddScriptLPS(1); | 3920 | m_host.AddScriptLPS(1); |
4083 | UUID invItemID = InventorySelf(); | 3921 | |
4084 | UUID targetID; | 3922 | UUID targetID; |
4085 | 3923 | ||
4086 | if (!UUID.TryParse(target, out targetID)) | 3924 | if (!UUID.TryParse(target, out targetID)) |
4087 | return; | 3925 | return; |
4088 | 3926 | ||
4089 | TaskInventoryItem item; | 3927 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
4090 | m_host.TaskInventory.LockItemsForRead(true); | ||
4091 | item = m_host.TaskInventory[invItemID]; | ||
4092 | m_host.TaskInventory.LockItemsForRead(false); | ||
4093 | |||
4094 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | ||
4095 | && !m_automaticLinkPermission) | 3928 | && !m_automaticLinkPermission) |
4096 | { | 3929 | { |
4097 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); | 3930 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); |
@@ -4099,7 +3932,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4099 | } | 3932 | } |
4100 | 3933 | ||
4101 | IClientAPI client = null; | 3934 | IClientAPI client = null; |
4102 | ScenePresence sp = World.GetScenePresence(item.PermsGranter); | 3935 | ScenePresence sp = World.GetScenePresence(m_item.PermsGranter); |
4103 | if (sp != null) | 3936 | if (sp != null) |
4104 | client = sp.ControllingClient; | 3937 | client = sp.ControllingClient; |
4105 | 3938 | ||
@@ -4145,18 +3978,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4145 | public void llBreakLink(int linknum) | 3978 | public void llBreakLink(int linknum) |
4146 | { | 3979 | { |
4147 | m_host.AddScriptLPS(1); | 3980 | m_host.AddScriptLPS(1); |
4148 | UUID invItemID = InventorySelf(); | ||
4149 | 3981 | ||
4150 | m_host.TaskInventory.LockItemsForRead(true); | 3982 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
4151 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | 3983 | && !m_automaticLinkPermission) |
4152 | && !m_automaticLinkPermission) | 3984 | { |
4153 | { | 3985 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); |
4154 | ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); | 3986 | return; |
4155 | m_host.TaskInventory.LockItemsForRead(false); | 3987 | } |
4156 | return; | 3988 | |
4157 | } | ||
4158 | m_host.TaskInventory.LockItemsForRead(false); | ||
4159 | |||
4160 | if (linknum < ScriptBaseClass.LINK_THIS) | 3989 | if (linknum < ScriptBaseClass.LINK_THIS) |
4161 | return; | 3990 | return; |
4162 | 3991 | ||
@@ -4255,12 +4084,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4255 | { | 4084 | { |
4256 | m_host.AddScriptLPS(1); | 4085 | m_host.AddScriptLPS(1); |
4257 | 4086 | ||
4258 | UUID invItemID = InventorySelf(); | 4087 | TaskInventoryItem item = m_item; |
4259 | |||
4260 | TaskInventoryItem item; | ||
4261 | m_host.TaskInventory.LockItemsForRead(true); | ||
4262 | item = m_host.TaskInventory[invItemID]; | ||
4263 | m_host.TaskInventory.LockItemsForRead(false); | ||
4264 | 4088 | ||
4265 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 | 4089 | if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 |
4266 | && !m_automaticLinkPermission) | 4090 | && !m_automaticLinkPermission) |
@@ -4457,11 +4281,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4457 | public void llGiveInventory(string destination, string inventory) | 4281 | public void llGiveInventory(string destination, string inventory) |
4458 | { | 4282 | { |
4459 | m_host.AddScriptLPS(1); | 4283 | m_host.AddScriptLPS(1); |
4460 | bool found = false; | 4284 | |
4461 | UUID destId = UUID.Zero; | 4285 | UUID destId = UUID.Zero; |
4462 | UUID objId = UUID.Zero; | ||
4463 | int assetType = 0; | ||
4464 | string objName = String.Empty; | ||
4465 | 4286 | ||
4466 | if (!UUID.TryParse(destination, out destId)) | 4287 | if (!UUID.TryParse(destination, out destId)) |
4467 | { | 4288 | { |
@@ -4469,28 +4290,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4469 | return; | 4290 | return; |
4470 | } | 4291 | } |
4471 | 4292 | ||
4472 | // move the first object found with this inventory name | 4293 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(inventory); |
4473 | m_host.TaskInventory.LockItemsForRead(true); | ||
4474 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
4475 | { | ||
4476 | if (inv.Value.Name == inventory) | ||
4477 | { | ||
4478 | found = true; | ||
4479 | objId = inv.Key; | ||
4480 | assetType = inv.Value.Type; | ||
4481 | objName = inv.Value.Name; | ||
4482 | break; | ||
4483 | } | ||
4484 | } | ||
4485 | m_host.TaskInventory.LockItemsForRead(false); | ||
4486 | 4294 | ||
4487 | if (!found) | 4295 | if (item == null) |
4488 | { | 4296 | { |
4489 | llSay(0, String.Format("Could not find object '{0}'", inventory)); | 4297 | llSay(0, String.Format("Could not find object '{0}'", inventory)); |
4490 | return; | 4298 | return; |
4491 | // throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory)); | 4299 | // throw new Exception(String.Format("The inventory object '{0}' could not be found", inventory)); |
4492 | } | 4300 | } |
4493 | 4301 | ||
4302 | UUID objId = item.ItemID; | ||
4303 | |||
4494 | // check if destination is an object | 4304 | // check if destination is an object |
4495 | if (World.GetSceneObjectPart(destId) != null) | 4305 | if (World.GetSceneObjectPart(destId) != null) |
4496 | { | 4306 | { |
@@ -4522,14 +4332,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4522 | return; | 4332 | return; |
4523 | 4333 | ||
4524 | byte[] bucket = new byte[1]; | 4334 | byte[] bucket = new byte[1]; |
4525 | bucket[0] = (byte)assetType; | 4335 | bucket[0] = (byte)item.Type; |
4526 | //byte[] objBytes = agentItem.ID.GetBytes(); | 4336 | //byte[] objBytes = agentItem.ID.GetBytes(); |
4527 | //Array.Copy(objBytes, 0, bucket, 1, 16); | 4337 | //Array.Copy(objBytes, 0, bucket, 1, 16); |
4528 | 4338 | ||
4529 | GridInstantMessage msg = new GridInstantMessage(World, | 4339 | GridInstantMessage msg = new GridInstantMessage(World, |
4530 | m_host.OwnerID, m_host.Name, destId, | 4340 | m_host.OwnerID, m_host.Name, destId, |
4531 | (byte)InstantMessageDialog.TaskInventoryOffered, | 4341 | (byte)InstantMessageDialog.TaskInventoryOffered, |
4532 | false, objName+". "+m_host.Name+" is located at "+ | 4342 | false, item.Name+". "+m_host.Name+" is located at "+ |
4533 | World.RegionInfo.RegionName+" "+ | 4343 | World.RegionInfo.RegionName+" "+ |
4534 | m_host.AbsolutePosition.ToString(), | 4344 | m_host.AbsolutePosition.ToString(), |
4535 | agentItem.ID, true, m_host.AbsolutePosition, | 4345 | agentItem.ID, true, m_host.AbsolutePosition, |
@@ -4557,27 +4367,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4557 | { | 4367 | { |
4558 | m_host.AddScriptLPS(1); | 4368 | m_host.AddScriptLPS(1); |
4559 | 4369 | ||
4560 | List<TaskInventoryItem> inv; | 4370 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); |
4561 | try | 4371 | |
4562 | { | 4372 | if (item == null) |
4563 | m_host.TaskInventory.LockItemsForRead(true); | 4373 | return; |
4564 | inv = new List<TaskInventoryItem>(m_host.TaskInventory.Values); | 4374 | |
4565 | } | 4375 | if (item.ItemID == m_item.ItemID) |
4566 | finally | 4376 | throw new ScriptDeleteException(); |
4567 | { | 4377 | else |
4568 | m_host.TaskInventory.LockItemsForRead(false); | 4378 | m_host.Inventory.RemoveInventoryItem(item.ItemID); |
4569 | } | ||
4570 | foreach (TaskInventoryItem item in inv) | ||
4571 | { | ||
4572 | if (item.Name == name) | ||
4573 | { | ||
4574 | if (item.ItemID == m_itemID) | ||
4575 | throw new ScriptDeleteException(); | ||
4576 | else | ||
4577 | m_host.Inventory.RemoveInventoryItem(item.ItemID); | ||
4578 | return; | ||
4579 | } | ||
4580 | } | ||
4581 | } | 4379 | } |
4582 | 4380 | ||
4583 | public void llSetText(string text, LSL_Vector color, double alpha) | 4381 | public void llSetText(string text, LSL_Vector color, double alpha) |
@@ -4705,8 +4503,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4705 | UUID rq = UUID.Random(); | 4503 | UUID rq = UUID.Random(); |
4706 | 4504 | ||
4707 | UUID tid = AsyncCommands. | 4505 | UUID tid = AsyncCommands. |
4708 | DataserverPlugin.RegisterRequest(m_localID, | 4506 | DataserverPlugin.RegisterRequest(m_host.LocalId, |
4709 | m_itemID, rq.ToString()); | 4507 | m_item.ItemID, rq.ToString()); |
4710 | 4508 | ||
4711 | AsyncCommands. | 4509 | AsyncCommands. |
4712 | DataserverPlugin.DataserverReply(rq.ToString(), reply); | 4510 | DataserverPlugin.DataserverReply(rq.ToString(), reply); |
@@ -4725,16 +4523,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4725 | { | 4523 | { |
4726 | m_host.AddScriptLPS(1); | 4524 | m_host.AddScriptLPS(1); |
4727 | 4525 | ||
4728 | //Clone is thread safe | 4526 | foreach (TaskInventoryItem item in m_host.Inventory.GetInventoryItems()) |
4729 | TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); | ||
4730 | |||
4731 | foreach (TaskInventoryItem item in itemDictionary.Values) | ||
4732 | { | 4527 | { |
4733 | if (item.Type == 3 && item.Name == name) | 4528 | if (item.Type == 3 && item.Name == name) |
4734 | { | 4529 | { |
4735 | UUID tid = AsyncCommands. | 4530 | UUID tid = AsyncCommands. |
4736 | DataserverPlugin.RegisterRequest(m_localID, | 4531 | DataserverPlugin.RegisterRequest(m_host.LocalId, |
4737 | m_itemID, item.AssetID.ToString()); | 4532 | m_item.ItemID, item.AssetID.ToString()); |
4738 | 4533 | ||
4739 | Vector3 region = new Vector3( | 4534 | Vector3 region = new Vector3( |
4740 | World.RegionInfo.RegionLocX * Constants.RegionSize, | 4535 | World.RegionInfo.RegionLocX * Constants.RegionSize, |
@@ -4760,6 +4555,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4760 | return tid.ToString(); | 4555 | return tid.ToString(); |
4761 | } | 4556 | } |
4762 | } | 4557 | } |
4558 | |||
4763 | ScriptSleep(1000); | 4559 | ScriptSleep(1000); |
4764 | return String.Empty; | 4560 | return String.Empty; |
4765 | } | 4561 | } |
@@ -4952,19 +4748,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4952 | UUID soundId = UUID.Zero; | 4748 | UUID soundId = UUID.Zero; |
4953 | if (!UUID.TryParse(impact_sound, out soundId)) | 4749 | if (!UUID.TryParse(impact_sound, out soundId)) |
4954 | { | 4750 | { |
4955 | m_host.TaskInventory.LockItemsForRead(true); | 4751 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(impact_sound); |
4956 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | 4752 | |
4957 | { | 4753 | if (item != null && item.Type == (int)AssetType.Sound) |
4958 | if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) | 4754 | soundId = item.AssetID; |
4959 | { | ||
4960 | soundId = item.AssetID; | ||
4961 | break; | ||
4962 | } | ||
4963 | } | ||
4964 | m_host.TaskInventory.LockItemsForRead(false); | ||
4965 | } | 4755 | } |
4966 | m_host.CollisionSoundVolume = (float)impact_volume; | 4756 | |
4967 | m_host.CollisionSound = soundId; | 4757 | m_host.CollisionSound = soundId; |
4758 | m_host.CollisionSoundVolume = (float)impact_volume; | ||
4968 | m_host.CollisionSoundType = 1; | 4759 | m_host.CollisionSoundType = 1; |
4969 | } | 4760 | } |
4970 | 4761 | ||
@@ -5006,10 +4797,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5006 | UUID partItemID; | 4797 | UUID partItemID; |
5007 | foreach (SceneObjectPart part in parts) | 4798 | foreach (SceneObjectPart part in parts) |
5008 | { | 4799 | { |
5009 | //Clone is thread safe | 4800 | foreach (TaskInventoryItem item in part.Inventory.GetInventoryItems()) |
5010 | TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); | ||
5011 | |||
5012 | foreach (TaskInventoryItem item in itemsDictionary.Values) | ||
5013 | { | 4801 | { |
5014 | if (item.Type == ScriptBaseClass.INVENTORY_SCRIPT) | 4802 | if (item.Type == ScriptBaseClass.INVENTORY_SCRIPT) |
5015 | { | 4803 | { |
@@ -5207,22 +4995,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5207 | 4995 | ||
5208 | public LSL_String llGetScriptName() | 4996 | public LSL_String llGetScriptName() |
5209 | { | 4997 | { |
5210 | string result = String.Empty; | ||
5211 | |||
5212 | m_host.AddScriptLPS(1); | 4998 | m_host.AddScriptLPS(1); |
5213 | 4999 | ||
5214 | m_host.TaskInventory.LockItemsForRead(true); | 5000 | return m_item.Name != null ? m_item.Name : String.Empty; |
5215 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
5216 | { | ||
5217 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
5218 | { | ||
5219 | result = item.Name!=null?item.Name:String.Empty; | ||
5220 | break; | ||
5221 | } | ||
5222 | } | ||
5223 | m_host.TaskInventory.LockItemsForRead(false); | ||
5224 | |||
5225 | return result; | ||
5226 | } | 5001 | } |
5227 | 5002 | ||
5228 | public LSL_Integer llGetLinkNumberOfSides(int link) | 5003 | public LSL_Integer llGetLinkNumberOfSides(int link) |
@@ -5393,22 +5168,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5393 | { | 5168 | { |
5394 | m_host.AddScriptLPS(1); | 5169 | m_host.AddScriptLPS(1); |
5395 | 5170 | ||
5396 | m_host.TaskInventory.LockItemsForRead(true); | 5171 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); |
5397 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 5172 | |
5173 | if (item == null) | ||
5174 | return UUID.Zero.ToString(); | ||
5175 | |||
5176 | if ((item.CurrentPermissions | ||
5177 | & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) | ||
5178 | == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) | ||
5398 | { | 5179 | { |
5399 | if (inv.Value.Name == name) | 5180 | return item.AssetID.ToString(); |
5400 | { | ||
5401 | if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) | ||
5402 | { | ||
5403 | m_host.TaskInventory.LockItemsForRead(false); | ||
5404 | return inv.Value.AssetID.ToString(); | ||
5405 | } | ||
5406 | else | ||
5407 | { | ||
5408 | m_host.TaskInventory.LockItemsForRead(false); | ||
5409 | return UUID.Zero.ToString(); | ||
5410 | } | ||
5411 | } | ||
5412 | } | 5181 | } |
5413 | m_host.TaskInventory.LockItemsForRead(false); | 5182 | m_host.TaskInventory.LockItemsForRead(false); |
5414 | 5183 | ||
@@ -6356,7 +6125,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6356 | } | 6125 | } |
6357 | } | 6126 | } |
6358 | } | 6127 | } |
6359 | List<UUID> presenceIds = new List<UUID>(); | ||
6360 | 6128 | ||
6361 | World.ForEachRootScenePresence( | 6129 | World.ForEachRootScenePresence( |
6362 | delegate (ScenePresence ssp) | 6130 | delegate (ScenePresence ssp) |
@@ -6507,7 +6275,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6507 | if (m_host.OwnerID == land.LandData.OwnerID) | 6275 | if (m_host.OwnerID == land.LandData.OwnerID) |
6508 | { | 6276 | { |
6509 | Vector3 pos = World.GetNearestAllowedPosition(presence, land); | 6277 | Vector3 pos = World.GetNearestAllowedPosition(presence, land); |
6510 | presence.TeleportWithMomentum(pos); | 6278 | presence.TeleportWithMomentum(pos, null); |
6511 | presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); | 6279 | presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); |
6512 | } | 6280 | } |
6513 | } | 6281 | } |
@@ -7032,22 +6800,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7032 | } | 6800 | } |
7033 | } | 6801 | } |
7034 | 6802 | ||
7035 | protected UUID GetTaskInventoryItem(string name) | ||
7036 | { | ||
7037 | m_host.TaskInventory.LockItemsForRead(true); | ||
7038 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
7039 | { | ||
7040 | if (inv.Value.Name == name) | ||
7041 | { | ||
7042 | m_host.TaskInventory.LockItemsForRead(false); | ||
7043 | return inv.Key; | ||
7044 | } | ||
7045 | } | ||
7046 | m_host.TaskInventory.LockItemsForRead(false); | ||
7047 | |||
7048 | return UUID.Zero; | ||
7049 | } | ||
7050 | |||
7051 | public void llGiveInventoryList(string destination, string category, LSL_List inventory) | 6803 | public void llGiveInventoryList(string destination, string category, LSL_List inventory) |
7052 | { | 6804 | { |
7053 | m_host.AddScriptLPS(1); | 6805 | m_host.AddScriptLPS(1); |
@@ -7060,16 +6812,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7060 | 6812 | ||
7061 | foreach (Object item in inventory.Data) | 6813 | foreach (Object item in inventory.Data) |
7062 | { | 6814 | { |
6815 | string rawItemString = item.ToString(); | ||
6816 | |||
7063 | UUID itemID; | 6817 | UUID itemID; |
7064 | if (UUID.TryParse(item.ToString(), out itemID)) | 6818 | if (UUID.TryParse(rawItemString, out itemID)) |
7065 | { | 6819 | { |
7066 | itemList.Add(itemID); | 6820 | itemList.Add(itemID); |
7067 | } | 6821 | } |
7068 | else | 6822 | else |
7069 | { | 6823 | { |
7070 | itemID = GetTaskInventoryItem(item.ToString()); | 6824 | TaskInventoryItem taskItem = m_host.Inventory.GetInventoryItem(rawItemString); |
7071 | if (itemID != UUID.Zero) | 6825 | |
7072 | itemList.Add(itemID); | 6826 | if (taskItem != null) |
6827 | itemList.Add(taskItem.ItemID); | ||
7073 | } | 6828 | } |
7074 | } | 6829 | } |
7075 | 6830 | ||
@@ -7391,9 +7146,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7391 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) | 7146 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) |
7392 | { | 7147 | { |
7393 | m_host.AddScriptLPS(1); | 7148 | m_host.AddScriptLPS(1); |
7394 | bool found = false; | 7149 | |
7395 | UUID destId = UUID.Zero; | 7150 | UUID destId = UUID.Zero; |
7396 | UUID srcId = UUID.Zero; | ||
7397 | 7151 | ||
7398 | if (!UUID.TryParse(target, out destId)) | 7152 | if (!UUID.TryParse(target, out destId)) |
7399 | { | 7153 | { |
@@ -7408,25 +7162,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7408 | } | 7162 | } |
7409 | 7163 | ||
7410 | // copy the first script found with this inventory name | 7164 | // copy the first script found with this inventory name |
7411 | TaskInventoryItem scriptItem = null; | 7165 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); |
7412 | m_host.TaskInventory.LockItemsForRead(true); | ||
7413 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
7414 | { | ||
7415 | if (inv.Value.Name == name) | ||
7416 | { | ||
7417 | // make sure the object is a script | ||
7418 | if (10 == inv.Value.Type) | ||
7419 | { | ||
7420 | found = true; | ||
7421 | srcId = inv.Key; | ||
7422 | scriptItem = inv.Value; | ||
7423 | break; | ||
7424 | } | ||
7425 | } | ||
7426 | } | ||
7427 | m_host.TaskInventory.LockItemsForRead(false); | ||
7428 | 7166 | ||
7429 | if (!found) | 7167 | // make sure the object is a script |
7168 | if (item == null || item.Type != 10) | ||
7430 | { | 7169 | { |
7431 | llSay(0, "Could not find script " + name); | 7170 | llSay(0, "Could not find script " + name); |
7432 | return; | 7171 | return; |
@@ -7435,13 +7174,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7435 | SceneObjectPart dest = World.GetSceneObjectPart(destId); | 7174 | SceneObjectPart dest = World.GetSceneObjectPart(destId); |
7436 | if (dest != null) | 7175 | if (dest != null) |
7437 | { | 7176 | { |
7438 | if ((scriptItem.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID) | 7177 | if ((item.BasePermissions & (uint)PermissionMask.Transfer) != 0 || dest.ParentGroup.RootPart.OwnerID == m_host.ParentGroup.RootPart.OwnerID) |
7439 | { | 7178 | { |
7440 | // the rest of the permission checks are done in RezScript, so check the pin there as well | 7179 | // the rest of the permission checks are done in RezScript, so check the pin there as well |
7441 | World.RezScriptFromPrim(srcId, m_host, destId, pin, running, start_param); | 7180 | World.RezScriptFromPrim(item.ItemID, m_host, destId, pin, running, start_param); |
7442 | 7181 | ||
7443 | if ((scriptItem.BasePermissions & (uint)PermissionMask.Copy) == 0) | 7182 | if ((item.BasePermissions & (uint)PermissionMask.Copy) == 0) |
7444 | m_host.Inventory.RemoveInventoryItem(srcId); | 7183 | m_host.Inventory.RemoveInventoryItem(item.ItemID); |
7445 | } | 7184 | } |
7446 | } | 7185 | } |
7447 | // this will cause the delay even if the script pin or permissions were wrong - seems ok | 7186 | // this will cause the delay even if the script pin or permissions were wrong - seems ok |
@@ -7454,14 +7193,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7454 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 7193 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
7455 | if (xmlrpcMod.IsEnabled()) | 7194 | if (xmlrpcMod.IsEnabled()) |
7456 | { | 7195 | { |
7457 | UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, UUID.Zero); | 7196 | UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_host.LocalId, m_item.ItemID, UUID.Zero); |
7458 | IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); | 7197 | IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>(); |
7459 | if (xmlRpcRouter != null) | 7198 | if (xmlRpcRouter != null) |
7460 | { | 7199 | { |
7461 | string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; | 7200 | string ExternalHostName = m_ScriptEngine.World.RegionInfo.ExternalHostName; |
7462 | 7201 | ||
7463 | xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, | 7202 | xmlRpcRouter.RegisterNewReceiver(m_ScriptEngine.ScriptModule, channelID, m_host.UUID, |
7464 | m_itemID, String.Format("http://{0}:{1}/", ExternalHostName, | 7203 | m_item.ItemID, String.Format("http://{0}:{1}/", ExternalHostName, |
7465 | xmlrpcMod.Port.ToString())); | 7204 | xmlrpcMod.Port.ToString())); |
7466 | } | 7205 | } |
7467 | object[] resobj = new object[] | 7206 | object[] resobj = new object[] |
@@ -7473,7 +7212,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7473 | new LSL_Integer(0), | 7212 | new LSL_Integer(0), |
7474 | new LSL_String(String.Empty) | 7213 | new LSL_String(String.Empty) |
7475 | }; | 7214 | }; |
7476 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams("remote_data", resobj, | 7215 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams("remote_data", resobj, |
7477 | new DetectParams[0])); | 7216 | new DetectParams[0])); |
7478 | } | 7217 | } |
7479 | ScriptSleep(1000); | 7218 | ScriptSleep(1000); |
@@ -7484,7 +7223,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7484 | m_host.AddScriptLPS(1); | 7223 | m_host.AddScriptLPS(1); |
7485 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 7224 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
7486 | ScriptSleep(3000); | 7225 | ScriptSleep(3000); |
7487 | return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); | 7226 | return (xmlrpcMod.SendRemoteData(m_host.LocalId, m_item.ItemID, channel, dest, idata, sdata)).ToString(); |
7488 | } | 7227 | } |
7489 | 7228 | ||
7490 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | 7229 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) |
@@ -8488,7 +8227,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8488 | return; | 8227 | return; |
8489 | face = (int)rules.GetLSLIntegerItem(idx++); | 8228 | face = (int)rules.GetLSLIntegerItem(idx++); |
8490 | int shiny = (int)rules.GetLSLIntegerItem(idx++); | 8229 | int shiny = (int)rules.GetLSLIntegerItem(idx++); |
8491 | Bumpiness bump = (Bumpiness)Convert.ToByte((int)rules.GetLSLIntegerItem(idx++)); | 8230 | Bumpiness bump = (Bumpiness)(int)rules.GetLSLIntegerItem(idx++); |
8492 | 8231 | ||
8493 | SetShiny(part, face, shiny, bump); | 8232 | SetShiny(part, face, shiny, bump); |
8494 | 8233 | ||
@@ -10330,7 +10069,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10330 | public LSL_String llGetSimulatorHostname() | 10069 | public LSL_String llGetSimulatorHostname() |
10331 | { | 10070 | { |
10332 | m_host.AddScriptLPS(1); | 10071 | m_host.AddScriptLPS(1); |
10333 | return System.Environment.MachineName; | 10072 | IUrlModule UrlModule = World.RequestModuleInterface<IUrlModule>(); |
10073 | return UrlModule.ExternalHostNameForLSL; | ||
10334 | } | 10074 | } |
10335 | 10075 | ||
10336 | // <summary> | 10076 | // <summary> |
@@ -10567,92 +10307,82 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10567 | } | 10307 | } |
10568 | } | 10308 | } |
10569 | 10309 | ||
10570 | public LSL_Integer llGetInventoryPermMask(string item, int mask) | 10310 | public LSL_Integer llGetInventoryPermMask(string itemName, int mask) |
10571 | { | 10311 | { |
10572 | m_host.AddScriptLPS(1); | 10312 | m_host.AddScriptLPS(1); |
10573 | 10313 | ||
10574 | m_host.TaskInventory.LockItemsForRead(true); | 10314 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); |
10575 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 10315 | |
10316 | if (item == null) | ||
10317 | return -1; | ||
10318 | |||
10319 | switch (mask) | ||
10576 | { | 10320 | { |
10577 | if (inv.Value.Name == item) | 10321 | case 0: |
10578 | { | 10322 | return (int)item.BasePermissions; |
10579 | m_host.TaskInventory.LockItemsForRead(false); | 10323 | case 1: |
10580 | switch (mask) | 10324 | return (int)item.CurrentPermissions; |
10581 | { | 10325 | case 2: |
10582 | case 0: | 10326 | return (int)item.GroupPermissions; |
10583 | return (int)inv.Value.BasePermissions; | 10327 | case 3: |
10584 | case 1: | 10328 | return (int)item.EveryonePermissions; |
10585 | return (int)inv.Value.CurrentPermissions; | 10329 | case 4: |
10586 | case 2: | 10330 | return (int)item.NextPermissions; |
10587 | return (int)inv.Value.GroupPermissions; | ||
10588 | case 3: | ||
10589 | return (int)inv.Value.EveryonePermissions; | ||
10590 | case 4: | ||
10591 | return (int)inv.Value.NextPermissions; | ||
10592 | } | ||
10593 | } | ||
10594 | } | 10331 | } |
10595 | m_host.TaskInventory.LockItemsForRead(false); | 10332 | m_host.TaskInventory.LockItemsForRead(false); |
10596 | 10333 | ||
10597 | return -1; | 10334 | return -1; |
10598 | } | 10335 | } |
10599 | 10336 | ||
10600 | public void llSetInventoryPermMask(string item, int mask, int value) | 10337 | public void llSetInventoryPermMask(string itemName, int mask, int value) |
10601 | { | 10338 | { |
10602 | m_host.AddScriptLPS(1); | 10339 | m_host.AddScriptLPS(1); |
10340 | |||
10603 | if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false)) | 10341 | if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false)) |
10604 | { | 10342 | { |
10605 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) | 10343 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) |
10606 | { | 10344 | { |
10607 | lock (m_host.TaskInventory) | 10345 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); |
10346 | |||
10347 | if (item != null) | ||
10608 | { | 10348 | { |
10609 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 10349 | switch (mask) |
10610 | { | 10350 | { |
10611 | if (inv.Value.Name == item) | 10351 | case 0: |
10612 | { | 10352 | item.BasePermissions = (uint)value; |
10613 | switch (mask) | 10353 | break; |
10614 | { | 10354 | case 1: |
10615 | case 0: | 10355 | item.CurrentPermissions = (uint)value; |
10616 | inv.Value.BasePermissions = (uint)value; | 10356 | break; |
10617 | break; | 10357 | case 2: |
10618 | case 1: | 10358 | item.GroupPermissions = (uint)value; |
10619 | inv.Value.CurrentPermissions = (uint)value; | 10359 | break; |
10620 | break; | 10360 | case 3: |
10621 | case 2: | 10361 | item.EveryonePermissions = (uint)value; |
10622 | inv.Value.GroupPermissions = (uint)value; | 10362 | break; |
10623 | break; | 10363 | case 4: |
10624 | case 3: | 10364 | item.NextPermissions = (uint)value; |
10625 | inv.Value.EveryonePermissions = (uint)value; | 10365 | break; |
10626 | break; | ||
10627 | case 4: | ||
10628 | inv.Value.NextPermissions = (uint)value; | ||
10629 | break; | ||
10630 | } | ||
10631 | } | ||
10632 | } | 10366 | } |
10633 | } | 10367 | } |
10634 | } | 10368 | } |
10635 | } | 10369 | } |
10636 | } | 10370 | } |
10637 | 10371 | ||
10638 | public LSL_String llGetInventoryCreator(string item) | 10372 | public LSL_String llGetInventoryCreator(string itemName) |
10639 | { | 10373 | { |
10640 | m_host.AddScriptLPS(1); | 10374 | m_host.AddScriptLPS(1); |
10641 | 10375 | ||
10642 | m_host.TaskInventory.LockItemsForRead(true); | 10376 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); |
10643 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 10377 | |
10378 | if (item == null) | ||
10644 | { | 10379 | { |
10645 | if (inv.Value.Name == item) | 10380 | llSay(0, "No item name '" + item + "'"); |
10646 | { | ||
10647 | m_host.TaskInventory.LockItemsForRead(false); | ||
10648 | return inv.Value.CreatorID.ToString(); | ||
10649 | } | ||
10650 | } | ||
10651 | m_host.TaskInventory.LockItemsForRead(false); | ||
10652 | 10381 | ||
10653 | llSay(0, "No item name '" + item + "'"); | 10382 | return String.Empty; |
10383 | } | ||
10654 | 10384 | ||
10655 | return String.Empty; | 10385 | return item.CreatorID.ToString(); |
10656 | } | 10386 | } |
10657 | 10387 | ||
10658 | public void llOwnerSay(string msg) | 10388 | public void llOwnerSay(string msg) |
@@ -10669,13 +10399,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10669 | { | 10399 | { |
10670 | m_host.AddScriptLPS(1); | 10400 | m_host.AddScriptLPS(1); |
10671 | if (m_UrlModule != null) | 10401 | if (m_UrlModule != null) |
10672 | return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); | 10402 | return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString(); |
10673 | return UUID.Zero.ToString(); | 10403 | return UUID.Zero.ToString(); |
10674 | } | 10404 | } |
10675 | 10405 | ||
10676 | public LSL_String llRequestSimulatorData(string simulator, int data) | 10406 | public LSL_String llRequestSimulatorData(string simulator, int data) |
10677 | { | 10407 | { |
10678 | IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_itemID, "OSSL"); | 10408 | IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL"); |
10679 | 10409 | ||
10680 | try | 10410 | try |
10681 | { | 10411 | { |
@@ -10685,7 +10415,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10685 | 10415 | ||
10686 | GridRegion info; | 10416 | GridRegion info; |
10687 | 10417 | ||
10688 | if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) | 10418 | if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) //Det data for this simulator? |
10419 | |||
10689 | info = new GridRegion(m_ScriptEngine.World.RegionInfo); | 10420 | info = new GridRegion(m_ScriptEngine.World.RegionInfo); |
10690 | else | 10421 | else |
10691 | info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); | 10422 | info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); |
@@ -10698,10 +10429,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10698 | ScriptSleep(1000); | 10429 | ScriptSleep(1000); |
10699 | return UUID.Zero.ToString(); | 10430 | return UUID.Zero.ToString(); |
10700 | } | 10431 | } |
10701 | reply = new LSL_Vector( | 10432 | if (m_ScriptEngine.World.RegionInfo.RegionName != simulator) |
10702 | info.RegionLocX, | 10433 | { |
10703 | info.RegionLocY, | 10434 | //Hypergrid Region co-ordinates |
10704 | 0).ToString(); | 10435 | uint rx = 0, ry = 0; |
10436 | Utils.LongToUInts(Convert.ToUInt64(info.RegionSecret), out rx, out ry); | ||
10437 | |||
10438 | reply = new LSL_Vector( | ||
10439 | rx, | ||
10440 | ry, | ||
10441 | 0).ToString(); | ||
10442 | } | ||
10443 | else | ||
10444 | { | ||
10445 | //Local-cooridnates | ||
10446 | reply = new LSL_Vector( | ||
10447 | info.RegionLocX, | ||
10448 | info.RegionLocY, | ||
10449 | 0).ToString(); | ||
10450 | } | ||
10705 | break; | 10451 | break; |
10706 | case ScriptBaseClass.DATA_SIM_STATUS: | 10452 | case ScriptBaseClass.DATA_SIM_STATUS: |
10707 | if (info != null) | 10453 | if (info != null) |
@@ -10737,7 +10483,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10737 | UUID rq = UUID.Random(); | 10483 | UUID rq = UUID.Random(); |
10738 | 10484 | ||
10739 | UUID tid = AsyncCommands. | 10485 | UUID tid = AsyncCommands. |
10740 | DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); | 10486 | DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); |
10741 | 10487 | ||
10742 | AsyncCommands. | 10488 | AsyncCommands. |
10743 | DataserverPlugin.DataserverReply(rq.ToString(), reply); | 10489 | DataserverPlugin.DataserverReply(rq.ToString(), reply); |
@@ -10756,7 +10502,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10756 | m_host.AddScriptLPS(1); | 10502 | m_host.AddScriptLPS(1); |
10757 | 10503 | ||
10758 | if (m_UrlModule != null) | 10504 | if (m_UrlModule != null) |
10759 | return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_itemID).ToString(); | 10505 | return m_UrlModule.RequestURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID).ToString(); |
10760 | return UUID.Zero.ToString(); | 10506 | return UUID.Zero.ToString(); |
10761 | } | 10507 | } |
10762 | 10508 | ||
@@ -10792,7 +10538,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10792 | // child agents have a mass of 1.0 | 10538 | // child agents have a mass of 1.0 |
10793 | return 1; | 10539 | return 1; |
10794 | else | 10540 | else |
10795 | return avatar.GetMass(); | 10541 | return (double)avatar.GetMass(); |
10796 | } | 10542 | } |
10797 | catch (KeyNotFoundException) | 10543 | catch (KeyNotFoundException) |
10798 | { | 10544 | { |
@@ -11196,18 +10942,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11196 | { | 10942 | { |
11197 | m_host.AddScriptLPS(1); | 10943 | m_host.AddScriptLPS(1); |
11198 | 10944 | ||
11199 | m_host.TaskInventory.LockItemsForRead(true); | 10945 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); |
11200 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
11201 | { | ||
11202 | if (inv.Value.Name == name) | ||
11203 | { | ||
11204 | m_host.TaskInventory.LockItemsForRead(false); | ||
11205 | return inv.Value.Type; | ||
11206 | } | ||
11207 | } | ||
11208 | m_host.TaskInventory.LockItemsForRead(false); | ||
11209 | 10946 | ||
11210 | return -1; | 10947 | if (item == null) |
10948 | return -1; | ||
10949 | |||
10950 | return item.Type; | ||
11211 | } | 10951 | } |
11212 | 10952 | ||
11213 | public void llSetPayPrice(int price, LSL_List quick_pay_buttons) | 10953 | public void llSetPayPrice(int price, LSL_List quick_pay_buttons) |
@@ -11235,32 +10975,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11235 | public LSL_Vector llGetCameraPos() | 10975 | public LSL_Vector llGetCameraPos() |
11236 | { | 10976 | { |
11237 | m_host.AddScriptLPS(1); | 10977 | m_host.AddScriptLPS(1); |
11238 | UUID invItemID = InventorySelf(); | ||
11239 | |||
11240 | if (invItemID == UUID.Zero) | ||
11241 | return new LSL_Vector(); | ||
11242 | |||
11243 | m_host.TaskInventory.LockItemsForRead(true); | ||
11244 | 10978 | ||
11245 | UUID agentID = m_host.TaskInventory[invItemID].PermsGranter; | 10979 | if (m_item.PermsGranter == UUID.Zero) |
10980 | return new LSL_Vector(); | ||
11246 | 10981 | ||
11247 | // if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) | 10982 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) |
11248 | if (agentID == UUID.Zero) | ||
11249 | { | ||
11250 | m_host.TaskInventory.LockItemsForRead(false); | ||
11251 | return new LSL_Vector(); | ||
11252 | } | ||
11253 | |||
11254 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) | ||
11255 | { | 10983 | { |
11256 | ShoutError("No permissions to track the camera"); | 10984 | ShoutError("No permissions to track the camera"); |
11257 | m_host.TaskInventory.LockItemsForRead(false); | ||
11258 | return new LSL_Vector(); | 10985 | return new LSL_Vector(); |
11259 | } | 10986 | } |
11260 | m_host.TaskInventory.LockItemsForRead(false); | ||
11261 | 10987 | ||
11262 | // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 10988 | // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
11263 | ScenePresence presence = World.GetScenePresence(agentID); | 10989 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
11264 | if (presence != null) | 10990 | if (presence != null) |
11265 | { | 10991 | { |
11266 | LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); | 10992 | LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); |
@@ -11272,30 +10998,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11272 | public LSL_Rotation llGetCameraRot() | 10998 | public LSL_Rotation llGetCameraRot() |
11273 | { | 10999 | { |
11274 | m_host.AddScriptLPS(1); | 11000 | m_host.AddScriptLPS(1); |
11275 | UUID invItemID = InventorySelf(); | ||
11276 | if (invItemID == UUID.Zero) | ||
11277 | return new LSL_Rotation(); | ||
11278 | 11001 | ||
11279 | m_host.TaskInventory.LockItemsForRead(true); | 11002 | if (m_item.PermsGranter == UUID.Zero) |
11280 | 11003 | return new LSL_Rotation(); | |
11281 | UUID agentID = m_host.TaskInventory[invItemID].PermsGranter; | ||
11282 | 11004 | ||
11283 | // if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) | 11005 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) |
11284 | if (agentID == UUID.Zero) | ||
11285 | { | ||
11286 | m_host.TaskInventory.LockItemsForRead(false); | ||
11287 | return new LSL_Rotation(); | ||
11288 | } | ||
11289 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) | ||
11290 | { | 11006 | { |
11291 | ShoutError("No permissions to track the camera"); | 11007 | ShoutError("No permissions to track the camera"); |
11292 | m_host.TaskInventory.LockItemsForRead(false); | ||
11293 | return new LSL_Rotation(); | 11008 | return new LSL_Rotation(); |
11294 | } | 11009 | } |
11295 | m_host.TaskInventory.LockItemsForRead(false); | ||
11296 | 11010 | ||
11297 | // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 11011 | // ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
11298 | ScenePresence presence = World.GetScenePresence(agentID); | 11012 | ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); |
11299 | if (presence != null) | 11013 | if (presence != null) |
11300 | { | 11014 | { |
11301 | return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); | 11015 | return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); |
@@ -11354,7 +11068,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11354 | public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) | 11068 | public void llMapDestination(string simname, LSL_Vector pos, LSL_Vector lookAt) |
11355 | { | 11069 | { |
11356 | m_host.AddScriptLPS(1); | 11070 | m_host.AddScriptLPS(1); |
11357 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0); | 11071 | DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_item.ItemID, 0); |
11358 | if (detectedParams == null) | 11072 | if (detectedParams == null) |
11359 | { | 11073 | { |
11360 | if (m_host.ParentGroup.IsAttachment == true) | 11074 | if (m_host.ParentGroup.IsAttachment == true) |
@@ -11478,30 +11192,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11478 | { | 11192 | { |
11479 | m_host.AddScriptLPS(1); | 11193 | m_host.AddScriptLPS(1); |
11480 | 11194 | ||
11481 | // our key in the object we are in | ||
11482 | UUID invItemID = InventorySelf(); | ||
11483 | if (invItemID == UUID.Zero) return; | ||
11484 | |||
11485 | // the object we are in | 11195 | // the object we are in |
11486 | UUID objectID = m_host.ParentUUID; | 11196 | UUID objectID = m_host.ParentUUID; |
11487 | if (objectID == UUID.Zero) return; | 11197 | if (objectID == UUID.Zero) |
11198 | return; | ||
11488 | 11199 | ||
11489 | UUID agentID; | ||
11490 | m_host.TaskInventory.LockItemsForRead(true); | ||
11491 | // we need the permission first, to know which avatar we want to set the camera for | 11200 | // we need the permission first, to know which avatar we want to set the camera for |
11492 | agentID = m_host.TaskInventory[invItemID].PermsGranter; | 11201 | UUID agentID = m_item.PermsGranter; |
11493 | 11202 | ||
11494 | if (agentID == UUID.Zero) | 11203 | if (agentID == UUID.Zero) |
11495 | { | ||
11496 | m_host.TaskInventory.LockItemsForRead(false); | ||
11497 | return; | 11204 | return; |
11498 | } | 11205 | |
11499 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) | 11206 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) |
11500 | { | ||
11501 | m_host.TaskInventory.LockItemsForRead(false); | ||
11502 | return; | 11207 | return; |
11503 | } | ||
11504 | m_host.TaskInventory.LockItemsForRead(false); | ||
11505 | 11208 | ||
11506 | ScenePresence presence = World.GetScenePresence(agentID); | 11209 | ScenePresence presence = World.GetScenePresence(agentID); |
11507 | 11210 | ||
@@ -11543,34 +11246,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11543 | { | 11246 | { |
11544 | m_host.AddScriptLPS(1); | 11247 | m_host.AddScriptLPS(1); |
11545 | 11248 | ||
11546 | // our key in the object we are in | ||
11547 | UUID invItemID=InventorySelf(); | ||
11548 | if (invItemID == UUID.Zero) return; | ||
11549 | |||
11550 | // the object we are in | 11249 | // the object we are in |
11551 | UUID objectID = m_host.ParentUUID; | 11250 | UUID objectID = m_host.ParentUUID; |
11552 | if (objectID == UUID.Zero) return; | 11251 | if (objectID == UUID.Zero) |
11252 | return; | ||
11553 | 11253 | ||
11554 | // we need the permission first, to know which avatar we want to clear the camera for | 11254 | // we need the permission first, to know which avatar we want to clear the camera for |
11555 | UUID agentID; | 11255 | UUID agentID = m_item.PermsGranter; |
11556 | m_host.TaskInventory.LockItemsForRead(true); | 11256 | |
11557 | agentID = m_host.TaskInventory[invItemID].PermsGranter; | ||
11558 | if (agentID == UUID.Zero) | 11257 | if (agentID == UUID.Zero) |
11559 | { | ||
11560 | m_host.TaskInventory.LockItemsForRead(false); | ||
11561 | return; | 11258 | return; |
11562 | } | 11259 | |
11563 | if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) | 11260 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) |
11564 | { | ||
11565 | m_host.TaskInventory.LockItemsForRead(false); | ||
11566 | return; | 11261 | return; |
11567 | } | ||
11568 | m_host.TaskInventory.LockItemsForRead(false); | ||
11569 | 11262 | ||
11570 | ScenePresence presence = World.GetScenePresence(agentID); | 11263 | ScenePresence presence = World.GetScenePresence(agentID); |
11571 | 11264 | ||
11572 | // we are not interested in child-agents | 11265 | // we are not interested in child-agents |
11573 | if (presence.IsChildAgent) return; | 11266 | if (presence.IsChildAgent) |
11267 | return; | ||
11574 | 11268 | ||
11575 | presence.ControllingClient.SendClearFollowCamProperties(objectID); | 11269 | presence.ControllingClient.SendClearFollowCamProperties(objectID); |
11576 | } | 11270 | } |
@@ -11761,8 +11455,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
11761 | } | 11455 | } |
11762 | } | 11456 | } |
11763 | 11457 | ||
11764 | UUID reqID = httpScriptMod. | 11458 | UUID reqID |
11765 | StartHttpRequest(m_localID, m_itemID, url, param, httpHeaders, body); | 11459 | = httpScriptMod.StartHttpRequest(m_host.LocalId, m_item.ItemID, url, param, httpHeaders, body); |
11766 | 11460 | ||
11767 | if (reqID != UUID.Zero) | 11461 | if (reqID != UUID.Zero) |
11768 | return reqID.ToString(); | 11462 | return reqID.ToString(); |
@@ -12016,19 +11710,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12016 | break; | 11710 | break; |
12017 | // For the following 8 see the Object version below | 11711 | // For the following 8 see the Object version below |
12018 | case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: | 11712 | case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: |
12019 | ret.Add(new LSL_Integer(0)); | 11713 | ret.Add(new LSL_Integer(av.RunningScriptCount())); |
12020 | break; | 11714 | break; |
12021 | case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: | 11715 | case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: |
12022 | ret.Add(new LSL_Integer(0)); | 11716 | ret.Add(new LSL_Integer(av.ScriptCount())); |
12023 | break; | 11717 | break; |
12024 | case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: | 11718 | case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: |
12025 | ret.Add(new LSL_Integer(0)); | 11719 | ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); |
12026 | break; | 11720 | break; |
12027 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: | 11721 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: |
12028 | ret.Add(new LSL_Float(0)); | 11722 | ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f)); |
12029 | break; | 11723 | break; |
12030 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | 11724 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: |
12031 | ret.Add(new LSL_Integer(0)); | 11725 | ret.Add(new LSL_Integer(1)); |
12032 | break; | 11726 | break; |
12033 | case ScriptBaseClass.OBJECT_SERVER_COST: | 11727 | case ScriptBaseClass.OBJECT_SERVER_COST: |
12034 | ret.Add(new LSL_Float(0)); | 11728 | ret.Add(new LSL_Float(0)); |
@@ -12086,37 +11780,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12086 | case ScriptBaseClass.OBJECT_CREATOR: | 11780 | case ScriptBaseClass.OBJECT_CREATOR: |
12087 | ret.Add(new LSL_String(obj.CreatorID.ToString())); | 11781 | ret.Add(new LSL_String(obj.CreatorID.ToString())); |
12088 | break; | 11782 | break; |
12089 | // The following 8 I have intentionaly coded to return zero. They are part of | ||
12090 | // "Land Impact" calculations. These calculations are probably not applicable | ||
12091 | // to OpenSim, required figures (cpu/memory usage) are not currently tracked | ||
12092 | // I have intentionally left these all at zero rather than return possibly | ||
12093 | // missleading numbers | ||
12094 | case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: | 11783 | case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT: |
12095 | // in SL this currently includes crashed scripts | 11784 | ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount())); |
12096 | ret.Add(new LSL_Integer(0)); | ||
12097 | break; | 11785 | break; |
12098 | case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: | 11786 | case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT: |
12099 | ret.Add(new LSL_Integer(0)); | 11787 | ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount())); |
12100 | break; | 11788 | break; |
12101 | case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: | 11789 | case ScriptBaseClass.OBJECT_SCRIPT_MEMORY: |
12102 | // The value returned in SL for mono scripts is 65536 * number of active scripts | 11790 | // The value returned in SL for mono scripts is 65536 * number of active scripts |
12103 | ret.Add(new LSL_Integer(0)); | 11791 | // and 16384 * number of active scripts for LSO. since llGetFreememory |
11792 | // is coded to give the LSO value use it here | ||
11793 | ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); | ||
12104 | break; | 11794 | break; |
12105 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: | 11795 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: |
12106 | // Average cpu time per simulator frame expended on all scripts in the objetc | 11796 | // Average cpu time in seconds per simulator frame expended on all scripts in the object |
12107 | ret.Add(new LSL_Float(0)); | 11797 | ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f)); |
12108 | break; | 11798 | break; |
12109 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | 11799 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: |
12110 | // according to the SL wiki A prim or linkset will have prim | 11800 | // according to the SL wiki A prim or linkset will have prim |
12111 | // equivalent of the number of prims in a linkset if it does not | 11801 | // equivalent of the number of prims in a linkset if it does not |
12112 | // contain a mesh anywhere in the link set or is not a normal prim | 11802 | // contain a mesh anywhere in the link set or is not a normal prim |
12113 | // The value returned in SL for normal prims is prim count | 11803 | // The value returned in SL for normal prims is prim count |
12114 | ret.Add(new LSL_Integer(0)); | 11804 | ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount)); |
12115 | break; | 11805 | break; |
12116 | 11806 | ||
12117 | // costs below may need to be diferent for root parts, need to check | 11807 | // costs below may need to be diferent for root parts, need to check |
12118 | case ScriptBaseClass.OBJECT_SERVER_COST: | 11808 | case ScriptBaseClass.OBJECT_SERVER_COST: |
12119 | // The value returned in SL for normal prims is prim count | 11809 | // The linden calculation is here |
11810 | // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight | ||
11811 | // The value returned in SL for normal prims looks like the prim count | ||
12120 | ret.Add(new LSL_Float(0)); | 11812 | ret.Add(new LSL_Float(0)); |
12121 | break; | 11813 | break; |
12122 | case ScriptBaseClass.OBJECT_STREAMING_COST: | 11814 | case ScriptBaseClass.OBJECT_STREAMING_COST: |
@@ -12141,22 +11833,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12141 | return new LSL_List(); | 11833 | return new LSL_List(); |
12142 | } | 11834 | } |
12143 | 11835 | ||
12144 | internal UUID ScriptByName(string name) | 11836 | internal UUID GetScriptByName(string name) |
12145 | { | 11837 | { |
12146 | m_host.TaskInventory.LockItemsForRead(true); | 11838 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); |
12147 | |||
12148 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
12149 | { | ||
12150 | if (item.Type == 10 && item.Name == name) | ||
12151 | { | ||
12152 | m_host.TaskInventory.LockItemsForRead(false); | ||
12153 | return item.ItemID; | ||
12154 | } | ||
12155 | } | ||
12156 | 11839 | ||
12157 | m_host.TaskInventory.LockItemsForRead(false); | 11840 | if (item == null || item.Type != 10) |
11841 | return UUID.Zero; | ||
12158 | 11842 | ||
12159 | return UUID.Zero; | 11843 | return item.ItemID; |
12160 | } | 11844 | } |
12161 | 11845 | ||
12162 | internal void ShoutError(string msg) | 11846 | internal void ShoutError(string msg) |
@@ -12196,21 +11880,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12196 | { | 11880 | { |
12197 | m_host.AddScriptLPS(1); | 11881 | m_host.AddScriptLPS(1); |
12198 | 11882 | ||
12199 | //Clone is thread safe | ||
12200 | TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); | ||
12201 | |||
12202 | UUID assetID = UUID.Zero; | 11883 | UUID assetID = UUID.Zero; |
12203 | 11884 | ||
12204 | if (!UUID.TryParse(name, out assetID)) | 11885 | if (!UUID.TryParse(name, out assetID)) |
12205 | { | 11886 | { |
12206 | foreach (TaskInventoryItem item in itemsDictionary.Values) | 11887 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); |
12207 | { | 11888 | |
12208 | if (item.Type == 7 && item.Name == name) | 11889 | if (item != null && item.Type == 7) |
12209 | { | 11890 | assetID = item.AssetID; |
12210 | assetID = item.AssetID; | ||
12211 | break; | ||
12212 | } | ||
12213 | } | ||
12214 | } | 11891 | } |
12215 | 11892 | ||
12216 | if (assetID == UUID.Zero) | 11893 | if (assetID == UUID.Zero) |
@@ -12222,7 +11899,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12222 | } | 11899 | } |
12223 | 11900 | ||
12224 | // was: UUID tid = tid = AsyncCommands. | 11901 | // was: UUID tid = tid = AsyncCommands. |
12225 | UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); | 11902 | UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString()); |
12226 | 11903 | ||
12227 | if (NotecardCache.IsCached(assetID)) | 11904 | if (NotecardCache.IsCached(assetID)) |
12228 | { | 11905 | { |
@@ -12259,21 +11936,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12259 | { | 11936 | { |
12260 | m_host.AddScriptLPS(1); | 11937 | m_host.AddScriptLPS(1); |
12261 | 11938 | ||
12262 | //Clone is thread safe | ||
12263 | TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); | ||
12264 | |||
12265 | UUID assetID = UUID.Zero; | 11939 | UUID assetID = UUID.Zero; |
12266 | 11940 | ||
12267 | if (!UUID.TryParse(name, out assetID)) | 11941 | if (!UUID.TryParse(name, out assetID)) |
12268 | { | 11942 | { |
12269 | foreach (TaskInventoryItem item in itemsDictionary.Values) | 11943 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name); |
12270 | { | 11944 | |
12271 | if (item.Type == 7 && item.Name == name) | 11945 | if (item != null && item.Type == 7) |
12272 | { | 11946 | assetID = item.AssetID; |
12273 | assetID = item.AssetID; | ||
12274 | break; | ||
12275 | } | ||
12276 | } | ||
12277 | } | 11947 | } |
12278 | 11948 | ||
12279 | if (assetID == UUID.Zero) | 11949 | if (assetID == UUID.Zero) |
@@ -12285,7 +11955,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12285 | } | 11955 | } |
12286 | 11956 | ||
12287 | // was: UUID tid = tid = AsyncCommands. | 11957 | // was: UUID tid = tid = AsyncCommands. |
12288 | UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, assetID.ToString()); | 11958 | UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString()); |
12289 | 11959 | ||
12290 | if (NotecardCache.IsCached(assetID)) | 11960 | if (NotecardCache.IsCached(assetID)) |
12291 | { | 11961 | { |
@@ -12369,7 +12039,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12369 | { | 12039 | { |
12370 | UUID rq = UUID.Random(); | 12040 | UUID rq = UUID.Random(); |
12371 | 12041 | ||
12372 | AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); | 12042 | AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); |
12373 | 12043 | ||
12374 | AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); | 12044 | AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), Name2Username(llKey2Name(id))); |
12375 | 12045 | ||
@@ -12385,7 +12055,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12385 | { | 12055 | { |
12386 | UUID rq = UUID.Random(); | 12056 | UUID rq = UUID.Random(); |
12387 | 12057 | ||
12388 | AsyncCommands.DataserverPlugin.RegisterRequest(m_localID, m_itemID, rq.ToString()); | 12058 | AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, rq.ToString()); |
12389 | 12059 | ||
12390 | AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); | 12060 | AsyncCommands.DataserverPlugin.DataserverReply(rq.ToString(), llKey2Name(id)); |
12391 | 12061 | ||
@@ -12587,7 +12257,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12587 | { | 12257 | { |
12588 | Tri t1 = new Tri(); | 12258 | Tri t1 = new Tri(); |
12589 | Tri t2 = new Tri(); | 12259 | Tri t2 = new Tri(); |
12590 | 12260 | ||
12591 | Vector3 p1 = new Vector3(x-1, y-1, (float)heightfield[x-1, y-1]); | 12261 | Vector3 p1 = new Vector3(x-1, y-1, (float)heightfield[x-1, y-1]); |
12592 | Vector3 p2 = new Vector3(x, y-1, (float)heightfield[x, y-1]); | 12262 | Vector3 p2 = new Vector3(x, y-1, (float)heightfield[x, y-1]); |
12593 | Vector3 p3 = new Vector3(x, y, (float)heightfield[x, y]); | 12263 | Vector3 p3 = new Vector3(x, y, (float)heightfield[x, y]); |
@@ -12628,7 +12298,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12628 | // sometimes | 12298 | // sometimes |
12629 | if (Math.Abs(b) < 0.000001) | 12299 | if (Math.Abs(b) < 0.000001) |
12630 | continue; | 12300 | continue; |
12631 | 12301 | ||
12632 | double r = a / b; | 12302 | double r = a / b; |
12633 | 12303 | ||
12634 | // ray points away from plane | 12304 | // ray points away from plane |
@@ -12888,7 +12558,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12888 | bool isAccount = false; | 12558 | bool isAccount = false; |
12889 | bool isGroup = false; | 12559 | bool isGroup = false; |
12890 | 12560 | ||
12891 | if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManager(m_host.OwnerID)) | 12561 | if (!estate.IsEstateOwner(m_host.OwnerID) || !estate.IsEstateManagerOrOwner(m_host.OwnerID)) |
12892 | return 0; | 12562 | return 0; |
12893 | 12563 | ||
12894 | UUID id = new UUID(); | 12564 | UUID id = new UUID(); |
@@ -12950,35 +12620,50 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
12950 | return 1; | 12620 | return 1; |
12951 | } | 12621 | } |
12952 | 12622 | ||
12953 | #region Not Implemented | 12623 | public LSL_Integer llGetMemoryLimit() |
12954 | // | 12624 | { |
12955 | // Listing the unimplemented lsl functions here, please move | 12625 | m_host.AddScriptLPS(1); |
12956 | // them from this region as they are completed | 12626 | // The value returned for LSO scripts in SL |
12957 | // | 12627 | return 16384; |
12628 | } | ||
12958 | 12629 | ||
12959 | public void llGetEnv(LSL_String name) | 12630 | public LSL_Integer llSetMemoryLimit(LSL_Integer limit) |
12960 | { | 12631 | { |
12961 | m_host.AddScriptLPS(1); | 12632 | m_host.AddScriptLPS(1); |
12962 | NotImplemented("llGetEnv"); | 12633 | // Treat as an LSO script |
12634 | return ScriptBaseClass.FALSE; | ||
12963 | } | 12635 | } |
12964 | 12636 | ||
12965 | public void llGetSPMaxMemory() | 12637 | public LSL_Integer llGetSPMaxMemory() |
12966 | { | 12638 | { |
12967 | m_host.AddScriptLPS(1); | 12639 | m_host.AddScriptLPS(1); |
12968 | NotImplemented("llGetSPMaxMemory"); | 12640 | // The value returned for LSO scripts in SL |
12641 | return 16384; | ||
12969 | } | 12642 | } |
12970 | 12643 | ||
12971 | public virtual LSL_Integer llGetUsedMemory() | 12644 | public virtual LSL_Integer llGetUsedMemory() |
12972 | { | 12645 | { |
12973 | m_host.AddScriptLPS(1); | 12646 | m_host.AddScriptLPS(1); |
12974 | NotImplemented("llGetUsedMemory"); | 12647 | // The value returned for LSO scripts in SL |
12975 | return 0; | 12648 | return 16384; |
12976 | } | 12649 | } |
12977 | 12650 | ||
12978 | public void llScriptProfiler(LSL_Integer flags) | 12651 | public void llScriptProfiler(LSL_Integer flags) |
12979 | { | 12652 | { |
12980 | m_host.AddScriptLPS(1); | 12653 | m_host.AddScriptLPS(1); |
12981 | //NotImplemented("llScriptProfiler"); | 12654 | // This does nothing for LSO scripts in SL |
12655 | } | ||
12656 | |||
12657 | #region Not Implemented | ||
12658 | // | ||
12659 | // Listing the unimplemented lsl functions here, please move | ||
12660 | // them from this region as they are completed | ||
12661 | // | ||
12662 | |||
12663 | public void llGetEnv(LSL_String name) | ||
12664 | { | ||
12665 | m_host.AddScriptLPS(1); | ||
12666 | NotImplemented("llGetEnv"); | ||
12982 | } | 12667 | } |
12983 | 12668 | ||
12984 | public void llSetSoundQueueing(int queue) | 12669 | public void llSetSoundQueueing(int queue) |
@@ -13058,8 +12743,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
13058 | 12743 | ||
13059 | try | 12744 | try |
13060 | { | 12745 | { |
13061 | UUID invItemID=InventorySelf(); | 12746 | TaskInventoryItem item = m_item; |
13062 | if (invItemID == UUID.Zero) | 12747 | if (item == null) |
13063 | { | 12748 | { |
13064 | replydata = "SERVICE_ERROR"; | 12749 | replydata = "SERVICE_ERROR"; |
13065 | return; | 12750 | return; |
@@ -13067,10 +12752,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
13067 | 12752 | ||
13068 | m_host.AddScriptLPS(1); | 12753 | m_host.AddScriptLPS(1); |
13069 | 12754 | ||
13070 | m_host.TaskInventory.LockItemsForRead(true); | ||
13071 | TaskInventoryItem item = m_host.TaskInventory[invItemID]; | ||
13072 | m_host.TaskInventory.LockItemsForRead(false); | ||
13073 | |||
13074 | if (item.PermsGranter == UUID.Zero) | 12755 | if (item.PermsGranter == UUID.Zero) |
13075 | { | 12756 | { |
13076 | replydata = "MISSING_PERMISSION_DEBIT"; | 12757 | replydata = "MISSING_PERMISSION_DEBIT"; |
@@ -13112,7 +12793,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
13112 | } | 12793 | } |
13113 | finally | 12794 | finally |
13114 | { | 12795 | { |
13115 | m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( | 12796 | m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( |
13116 | "transaction_result", new Object[] { | 12797 | "transaction_result", new Object[] { |
13117 | new LSL_String(txn.ToString()), | 12798 | new LSL_String(txn.ToString()), |
13118 | new LSL_Integer(replycode), | 12799 | new LSL_Integer(replycode), |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs index 77a784d..795de80 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs | |||
@@ -58,17 +58,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
58 | { | 58 | { |
59 | internal IScriptEngine m_ScriptEngine; | 59 | internal IScriptEngine m_ScriptEngine; |
60 | internal SceneObjectPart m_host; | 60 | internal SceneObjectPart m_host; |
61 | internal uint m_localID; | ||
62 | internal UUID m_itemID; | ||
63 | internal bool m_LSFunctionsEnabled = false; | 61 | internal bool m_LSFunctionsEnabled = false; |
64 | internal IScriptModuleComms m_comms = null; | 62 | internal IScriptModuleComms m_comms = null; |
65 | 63 | ||
66 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 64 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
67 | { | 65 | { |
68 | m_ScriptEngine = ScriptEngine; | 66 | m_ScriptEngine = ScriptEngine; |
69 | m_host = host; | 67 | m_host = host; |
70 | m_localID = localID; | ||
71 | m_itemID = itemID; | ||
72 | 68 | ||
73 | if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) | 69 | if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) |
74 | m_LSFunctionsEnabled = true; | 70 | m_LSFunctionsEnabled = true; |
@@ -449,7 +445,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
449 | LSShoutError("LightShare functions are not enabled."); | 445 | LSShoutError("LightShare functions are not enabled."); |
450 | return 0; | 446 | return 0; |
451 | } | 447 | } |
452 | if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 448 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) |
453 | { | 449 | { |
454 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); | 450 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); |
455 | return 0; | 451 | return 0; |
@@ -477,7 +473,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
477 | LSShoutError("LightShare functions are not enabled."); | 473 | LSShoutError("LightShare functions are not enabled."); |
478 | return; | 474 | return; |
479 | } | 475 | } |
480 | if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 476 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) |
481 | { | 477 | { |
482 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); | 478 | LSShoutError("lsSetWindlightScene can only be used by estate managers or owners."); |
483 | return; | 479 | return; |
@@ -500,7 +496,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
500 | LSShoutError("LightShare functions are not enabled."); | 496 | LSShoutError("LightShare functions are not enabled."); |
501 | return 0; | 497 | return 0; |
502 | } | 498 | } |
503 | if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) | 499 | if (!World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200) |
504 | { | 500 | { |
505 | LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); | 501 | LSShoutError("lsSetWindlightSceneTargeted can only be used by estate managers or owners."); |
506 | return 0; | 502 | return 0; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs index 7c07e15..4bd3dff 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs | |||
@@ -57,17 +57,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
57 | { | 57 | { |
58 | internal IScriptEngine m_ScriptEngine; | 58 | internal IScriptEngine m_ScriptEngine; |
59 | internal SceneObjectPart m_host; | 59 | internal SceneObjectPart m_host; |
60 | internal uint m_localID; | 60 | internal TaskInventoryItem m_item; |
61 | internal UUID m_itemID; | ||
62 | internal bool m_MODFunctionsEnabled = false; | 61 | internal bool m_MODFunctionsEnabled = false; |
63 | internal IScriptModuleComms m_comms = null; | 62 | internal IScriptModuleComms m_comms = null; |
64 | 63 | ||
65 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 64 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
66 | { | 65 | { |
67 | m_ScriptEngine = ScriptEngine; | 66 | m_ScriptEngine = ScriptEngine; |
68 | m_host = host; | 67 | m_host = host; |
69 | m_localID = localID; | 68 | m_item = item; |
70 | m_itemID = itemID; | ||
71 | 69 | ||
72 | if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false)) | 70 | if (m_ScriptEngine.Config.GetBoolean("AllowMODFunctions", false)) |
73 | m_MODFunctionsEnabled = true; | 71 | m_MODFunctionsEnabled = true; |
@@ -252,7 +250,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
252 | // non-null but don't trust it completely | 250 | // non-null but don't trust it completely |
253 | try | 251 | try |
254 | { | 252 | { |
255 | object result = m_comms.InvokeOperation(m_host.UUID, m_itemID, fname, convertedParms); | 253 | object result = m_comms.InvokeOperation(m_host.UUID, m_item.ItemID, fname, convertedParms); |
256 | if (result != null) | 254 | if (result != null) |
257 | return result; | 255 | return result; |
258 | 256 | ||
@@ -279,7 +277,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
279 | 277 | ||
280 | UUID req = UUID.Random(); | 278 | UUID req = UUID.Random(); |
281 | 279 | ||
282 | m_comms.RaiseEvent(m_itemID, req.ToString(), module, command, k); | 280 | m_comms.RaiseEvent(m_item.ItemID, req.ToString(), module, command, k); |
283 | 281 | ||
284 | return req.ToString(); | 282 | return req.ToString(); |
285 | } | 283 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 0dc2aa2..b639d36 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -126,13 +126,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
126 | [Serializable] | 126 | [Serializable] |
127 | public class OSSL_Api : MarshalByRefObject, IOSSL_Api, IScriptApi | 127 | public class OSSL_Api : MarshalByRefObject, IOSSL_Api, IScriptApi |
128 | { | 128 | { |
129 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 129 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
130 | |||
131 | public const string GridInfoServiceConfigSectionName = "GridInfoService"; | ||
130 | 132 | ||
131 | internal IScriptEngine m_ScriptEngine; | 133 | internal IScriptEngine m_ScriptEngine; |
132 | internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there | 134 | internal ILSL_Api m_LSL_Api = null; // get a reference to the LSL API so we can call methods housed there |
133 | internal SceneObjectPart m_host; | 135 | internal SceneObjectPart m_host; |
134 | internal uint m_localID; | 136 | internal TaskInventoryItem m_item; |
135 | internal UUID m_itemID; | ||
136 | internal bool m_OSFunctionsEnabled = false; | 137 | internal bool m_OSFunctionsEnabled = false; |
137 | internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; | 138 | internal ThreatLevel m_MaxThreatLevel = ThreatLevel.VeryLow; |
138 | internal float m_ScriptDelayFactor = 1.0f; | 139 | internal float m_ScriptDelayFactor = 1.0f; |
@@ -140,12 +141,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
140 | internal bool m_debuggerSafe = false; | 141 | internal bool m_debuggerSafe = false; |
141 | internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); | 142 | internal Dictionary<string, FunctionPerms > m_FunctionPerms = new Dictionary<string, FunctionPerms >(); |
142 | 143 | ||
143 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID) | 144 | public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) |
144 | { | 145 | { |
145 | m_ScriptEngine = ScriptEngine; | 146 | m_ScriptEngine = ScriptEngine; |
146 | m_host = host; | 147 | m_host = host; |
147 | m_localID = localID; | 148 | m_item = item; |
148 | m_itemID = itemID; | ||
149 | m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); | 149 | m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); |
150 | 150 | ||
151 | if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) | 151 | if (m_ScriptEngine.Config.GetBoolean("AllowOSFunctions", false)) |
@@ -218,12 +218,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
218 | } | 218 | } |
219 | } | 219 | } |
220 | 220 | ||
221 | /// <summary> | ||
222 | /// Initialize the LSL interface. | ||
223 | /// </summary> | ||
224 | /// <remarks> | ||
225 | /// FIXME: This is an abomination. We should be able to set this up earlier but currently we have no | ||
226 | /// guarantee the interface is present on Initialize(). There needs to be another post initialize call from | ||
227 | /// ScriptInstance. | ||
228 | /// </remarks> | ||
221 | private void InitLSL() | 229 | private void InitLSL() |
222 | { | 230 | { |
223 | if (m_LSL_Api != null) | 231 | if (m_LSL_Api != null) |
224 | return; | 232 | return; |
225 | 233 | ||
226 | m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_itemID, "LSL"); | 234 | m_LSL_Api = (ILSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "LSL"); |
227 | } | 235 | } |
228 | 236 | ||
229 | // | 237 | // |
@@ -342,22 +350,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
342 | return; | 350 | return; |
343 | } | 351 | } |
344 | 352 | ||
345 | TaskInventoryItem ti = m_host.Inventory.GetInventoryItem(m_itemID); | 353 | UUID ownerID = m_item.OwnerID; |
346 | if (ti == null) | ||
347 | { | ||
348 | OSSLError( | ||
349 | String.Format("{0} permission error. Can't find script in prim inventory.", | ||
350 | function)); | ||
351 | } | ||
352 | |||
353 | UUID ownerID = ti.OwnerID; | ||
354 | 354 | ||
355 | //OSSL only may be used if objet is in the same group as the parcel | 355 | //OSSL only may be used if object is in the same group as the parcel |
356 | if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) | 356 | if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) |
357 | { | 357 | { |
358 | ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | 358 | ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); |
359 | 359 | ||
360 | if (land.LandData.GroupID == ti.GroupID && land.LandData.GroupID != UUID.Zero) | 360 | if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero) |
361 | { | 361 | { |
362 | return; | 362 | return; |
363 | } | 363 | } |
@@ -378,7 +378,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
378 | if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER")) | 378 | if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("ESTATE_MANAGER")) |
379 | { | 379 | { |
380 | //Only Estate Managers may use the function | 380 | //Only Estate Managers may use the function |
381 | if (World.RegionInfo.EstateSettings.IsEstateManager(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) | 381 | if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) |
382 | { | 382 | { |
383 | return; | 383 | return; |
384 | } | 384 | } |
@@ -393,13 +393,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
393 | } | 393 | } |
394 | } | 394 | } |
395 | 395 | ||
396 | if (!m_FunctionPerms[function].AllowedCreators.Contains(ti.CreatorID)) | 396 | if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID)) |
397 | OSSLError( | 397 | OSSLError( |
398 | String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", | 398 | String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", |
399 | function)); | 399 | function)); |
400 | if (ti.CreatorID != ownerID) | 400 | |
401 | if (m_item.CreatorID != ownerID) | ||
401 | { | 402 | { |
402 | if ((ti.CurrentPermissions & (uint)PermissionMask.Modify) != 0) | 403 | if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0) |
403 | OSSLError( | 404 | OSSLError( |
404 | String.Format("{0} permission denied. Script permissions error.", | 405 | String.Format("{0} permission denied. Script permissions error.", |
405 | function)); | 406 | function)); |
@@ -730,11 +731,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
730 | 731 | ||
731 | m_host.AddScriptLPS(1); | 732 | m_host.AddScriptLPS(1); |
732 | 733 | ||
734 | // For safety, we add another permission check here, and don't rely only on the standard OSSL permissions | ||
733 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) | 735 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) |
734 | { | 736 | { |
735 | MainConsole.Instance.RunCommand(command); | 737 | MainConsole.Instance.RunCommand(command); |
736 | return true; | 738 | return true; |
737 | } | 739 | } |
740 | |||
738 | return false; | 741 | return false; |
739 | } | 742 | } |
740 | 743 | ||
@@ -957,21 +960,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
957 | UUID avatarID = (UUID)avatar; | 960 | UUID avatarID = (UUID)avatar; |
958 | 961 | ||
959 | m_host.AddScriptLPS(1); | 962 | m_host.AddScriptLPS(1); |
963 | |||
964 | // FIXME: What we really want to do here is factor out the similar code in llStopAnimation() to a common | ||
965 | // method (though see that doesn't do the is animation check, which is probably a bug) and have both | ||
966 | // these functions call that common code. However, this does mean navigating the brain-dead requirement | ||
967 | // of calling InitLSL() | ||
960 | if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) | 968 | if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) |
961 | { | 969 | { |
962 | ScenePresence target = (ScenePresence)World.Entities[avatarID]; | 970 | ScenePresence target = (ScenePresence)World.Entities[avatarID]; |
963 | if (target != null) | 971 | if (target != null) |
964 | { | 972 | { |
965 | UUID animID = UUID.Zero; | 973 | UUID animID; |
966 | m_host.TaskInventory.LockItemsForRead(true); | 974 | |
967 | foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) | 975 | if (!UUID.TryParse(animation, out animID)) |
968 | { | 976 | { |
969 | if (inv.Value.Name == animation) | 977 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(animation); |
970 | { | 978 | if (item != null && item.Type == (int)AssetType.Animation) |
971 | if (inv.Value.Type == (int)AssetType.Animation) | 979 | animID = item.AssetID; |
972 | animID = inv.Value.AssetID; | 980 | else |
973 | continue; | 981 | animID = UUID.Zero; |
974 | } | ||
975 | } | 982 | } |
976 | m_host.TaskInventory.LockItemsForRead(false); | 983 | m_host.TaskInventory.LockItemsForRead(false); |
977 | 984 | ||
@@ -1178,7 +1185,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1178 | CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); | 1185 | CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); |
1179 | m_host.AddScriptLPS(1); | 1186 | m_host.AddScriptLPS(1); |
1180 | 1187 | ||
1181 | m_host.SetScriptEvents(m_itemID, events); | 1188 | m_host.SetScriptEvents(m_item.ItemID, events); |
1182 | } | 1189 | } |
1183 | 1190 | ||
1184 | public void osSetRegionWaterHeight(double height) | 1191 | public void osSetRegionWaterHeight(double height) |
@@ -1186,12 +1193,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1186 | CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); | 1193 | CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); |
1187 | 1194 | ||
1188 | m_host.AddScriptLPS(1); | 1195 | m_host.AddScriptLPS(1); |
1189 | //Check to make sure that the script's owner is the estate manager/master | 1196 | |
1190 | //World.Permissions.GenericEstatePermission( | 1197 | World.EventManager.TriggerRequestChangeWaterHeight((float)height); |
1191 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
1192 | { | ||
1193 | World.EventManager.TriggerRequestChangeWaterHeight((float)height); | ||
1194 | } | ||
1195 | } | 1198 | } |
1196 | 1199 | ||
1197 | /// <summary> | 1200 | /// <summary> |
@@ -1202,27 +1205,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1202 | /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> | 1205 | /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> |
1203 | public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour) | 1206 | public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour) |
1204 | { | 1207 | { |
1205 | CheckThreatLevel(ThreatLevel.Nuisance, "osSetRegionSunSettings"); | 1208 | CheckThreatLevel(ThreatLevel.High, "osSetRegionSunSettings"); |
1206 | 1209 | ||
1207 | m_host.AddScriptLPS(1); | 1210 | m_host.AddScriptLPS(1); |
1208 | //Check to make sure that the script's owner is the estate manager/master | ||
1209 | //World.Permissions.GenericEstatePermission( | ||
1210 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
1211 | { | ||
1212 | while (sunHour > 24.0) | ||
1213 | sunHour -= 24.0; | ||
1214 | 1211 | ||
1215 | while (sunHour < 0) | 1212 | while (sunHour > 24.0) |
1216 | sunHour += 24.0; | 1213 | sunHour -= 24.0; |
1217 | 1214 | ||
1215 | while (sunHour < 0) | ||
1216 | sunHour += 24.0; | ||
1218 | 1217 | ||
1219 | World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; | 1218 | World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; |
1220 | World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 | 1219 | World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 |
1221 | World.RegionInfo.RegionSettings.FixedSun = sunFixed; | 1220 | World.RegionInfo.RegionSettings.FixedSun = sunFixed; |
1222 | World.RegionInfo.RegionSettings.Save(); | 1221 | World.RegionInfo.RegionSettings.Save(); |
1223 | 1222 | ||
1224 | World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); | 1223 | World.EventManager.TriggerEstateToolsSunUpdate( |
1225 | } | 1224 | World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour); |
1226 | } | 1225 | } |
1227 | 1226 | ||
1228 | /// <summary> | 1227 | /// <summary> |
@@ -1232,26 +1231,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1232 | /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> | 1231 | /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> |
1233 | public void osSetEstateSunSettings(bool sunFixed, double sunHour) | 1232 | public void osSetEstateSunSettings(bool sunFixed, double sunHour) |
1234 | { | 1233 | { |
1235 | CheckThreatLevel(ThreatLevel.Nuisance, "osSetEstateSunSettings"); | 1234 | CheckThreatLevel(ThreatLevel.High, "osSetEstateSunSettings"); |
1236 | 1235 | ||
1237 | m_host.AddScriptLPS(1); | 1236 | m_host.AddScriptLPS(1); |
1238 | //Check to make sure that the script's owner is the estate manager/master | ||
1239 | //World.Permissions.GenericEstatePermission( | ||
1240 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
1241 | { | ||
1242 | while (sunHour > 24.0) | ||
1243 | sunHour -= 24.0; | ||
1244 | 1237 | ||
1245 | while (sunHour < 0) | 1238 | while (sunHour > 24.0) |
1246 | sunHour += 24.0; | 1239 | sunHour -= 24.0; |
1247 | 1240 | ||
1248 | World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; | 1241 | while (sunHour < 0) |
1249 | World.RegionInfo.EstateSettings.SunPosition = sunHour; | 1242 | sunHour += 24.0; |
1250 | World.RegionInfo.EstateSettings.FixedSun = sunFixed; | ||
1251 | World.RegionInfo.EstateSettings.Save(); | ||
1252 | 1243 | ||
1253 | World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); | 1244 | World.RegionInfo.EstateSettings.UseGlobalTime = !sunFixed; |
1254 | } | 1245 | World.RegionInfo.EstateSettings.SunPosition = sunHour; |
1246 | World.RegionInfo.EstateSettings.FixedSun = sunFixed; | ||
1247 | World.RegionInfo.EstateSettings.Save(); | ||
1248 | |||
1249 | World.EventManager.TriggerEstateToolsSunUpdate( | ||
1250 | World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour); | ||
1255 | } | 1251 | } |
1256 | 1252 | ||
1257 | /// <summary> | 1253 | /// <summary> |
@@ -1627,7 +1623,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1627 | 1623 | ||
1628 | public Object osParseJSONNew(string JSON) | 1624 | public Object osParseJSONNew(string JSON) |
1629 | { | 1625 | { |
1630 | CheckThreatLevel(ThreatLevel.None, "osParseJSON"); | 1626 | CheckThreatLevel(ThreatLevel.None, "osParseJSONNew"); |
1631 | 1627 | ||
1632 | m_host.AddScriptLPS(1); | 1628 | m_host.AddScriptLPS(1); |
1633 | 1629 | ||
@@ -1980,7 +1976,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1980 | { | 1976 | { |
1981 | string retval = String.Empty; | 1977 | string retval = String.Empty; |
1982 | IConfigSource config = m_ScriptEngine.ConfigSource; | 1978 | IConfigSource config = m_ScriptEngine.ConfigSource; |
1983 | string url = config.Configs["GridInfo"].GetString("GridInfoURI", String.Empty); | 1979 | string url = null; |
1980 | |||
1981 | IConfig gridInfoConfig = config.Configs["GridInfo"]; | ||
1982 | |||
1983 | if (gridInfoConfig != null) | ||
1984 | url = gridInfoConfig.GetString("GridInfoURI", String.Empty); | ||
1984 | 1985 | ||
1985 | if (String.IsNullOrEmpty(url)) | 1986 | if (String.IsNullOrEmpty(url)) |
1986 | return "Configuration Error!"; | 1987 | return "Configuration Error!"; |
@@ -2042,8 +2043,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2042 | string nick = String.Empty; | 2043 | string nick = String.Empty; |
2043 | IConfigSource config = m_ScriptEngine.ConfigSource; | 2044 | IConfigSource config = m_ScriptEngine.ConfigSource; |
2044 | 2045 | ||
2045 | if (config.Configs["GridInfo"] != null) | 2046 | if (config.Configs[GridInfoServiceConfigSectionName] != null) |
2046 | nick = config.Configs["GridInfo"].GetString("gridnick", nick); | 2047 | nick = config.Configs[GridInfoServiceConfigSectionName].GetString("gridnick", nick); |
2047 | 2048 | ||
2048 | if (String.IsNullOrEmpty(nick)) | 2049 | if (String.IsNullOrEmpty(nick)) |
2049 | nick = GridUserInfo(InfoType.Nick); | 2050 | nick = GridUserInfo(InfoType.Nick); |
@@ -2059,8 +2060,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2059 | string name = String.Empty; | 2060 | string name = String.Empty; |
2060 | IConfigSource config = m_ScriptEngine.ConfigSource; | 2061 | IConfigSource config = m_ScriptEngine.ConfigSource; |
2061 | 2062 | ||
2062 | if (config.Configs["GridInfo"] != null) | 2063 | if (config.Configs[GridInfoServiceConfigSectionName] != null) |
2063 | name = config.Configs["GridInfo"].GetString("gridname", name); | 2064 | name = config.Configs[GridInfoServiceConfigSectionName].GetString("gridname", name); |
2064 | 2065 | ||
2065 | if (String.IsNullOrEmpty(name)) | 2066 | if (String.IsNullOrEmpty(name)) |
2066 | name = GridUserInfo(InfoType.Name); | 2067 | name = GridUserInfo(InfoType.Name); |
@@ -2076,8 +2077,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2076 | string loginURI = String.Empty; | 2077 | string loginURI = String.Empty; |
2077 | IConfigSource config = m_ScriptEngine.ConfigSource; | 2078 | IConfigSource config = m_ScriptEngine.ConfigSource; |
2078 | 2079 | ||
2079 | if (config.Configs["GridInfo"] != null) | 2080 | if (config.Configs[GridInfoServiceConfigSectionName] != null) |
2080 | loginURI = config.Configs["GridInfo"].GetString("login", loginURI); | 2081 | loginURI = config.Configs[GridInfoServiceConfigSectionName].GetString("login", loginURI); |
2081 | 2082 | ||
2082 | if (String.IsNullOrEmpty(loginURI)) | 2083 | if (String.IsNullOrEmpty(loginURI)) |
2083 | loginURI = GridUserInfo(InfoType.Login); | 2084 | loginURI = GridUserInfo(InfoType.Login); |
@@ -2124,8 +2125,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2124 | string retval = String.Empty; | 2125 | string retval = String.Empty; |
2125 | IConfigSource config = m_ScriptEngine.ConfigSource; | 2126 | IConfigSource config = m_ScriptEngine.ConfigSource; |
2126 | 2127 | ||
2127 | if (config.Configs["GridInfo"] != null) | 2128 | if (config.Configs[GridInfoServiceConfigSectionName] != null) |
2128 | retval = config.Configs["GridInfo"].GetString(key, retval); | 2129 | retval = config.Configs[GridInfoServiceConfigSectionName].GetString(key, retval); |
2129 | 2130 | ||
2130 | if (String.IsNullOrEmpty(retval)) | 2131 | if (String.IsNullOrEmpty(retval)) |
2131 | retval = GridUserInfo(InfoType.Custom, key); | 2132 | retval = GridUserInfo(InfoType.Custom, key); |
@@ -2135,7 +2136,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2135 | 2136 | ||
2136 | public LSL_String osFormatString(string str, LSL_List strings) | 2137 | public LSL_String osFormatString(string str, LSL_List strings) |
2137 | { | 2138 | { |
2138 | CheckThreatLevel(ThreatLevel.Low, "osFormatString"); | 2139 | CheckThreatLevel(ThreatLevel.VeryLow, "osFormatString"); |
2139 | m_host.AddScriptLPS(1); | 2140 | m_host.AddScriptLPS(1); |
2140 | 2141 | ||
2141 | return String.Format(str, strings.Data); | 2142 | return String.Format(str, strings.Data); |
@@ -2143,7 +2144,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2143 | 2144 | ||
2144 | public LSL_List osMatchString(string src, string pattern, int start) | 2145 | public LSL_List osMatchString(string src, string pattern, int start) |
2145 | { | 2146 | { |
2146 | CheckThreatLevel(ThreatLevel.High, "osMatchString"); | 2147 | CheckThreatLevel(ThreatLevel.VeryLow, "osMatchString"); |
2147 | m_host.AddScriptLPS(1); | 2148 | m_host.AddScriptLPS(1); |
2148 | 2149 | ||
2149 | LSL_List result = new LSL_List(); | 2150 | LSL_List result = new LSL_List(); |
@@ -2185,7 +2186,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2185 | 2186 | ||
2186 | public LSL_String osReplaceString(string src, string pattern, string replace, int count, int start) | 2187 | public LSL_String osReplaceString(string src, string pattern, string replace, int count, int start) |
2187 | { | 2188 | { |
2188 | CheckThreatLevel(ThreatLevel.High, "osReplaceString"); | 2189 | CheckThreatLevel(ThreatLevel.VeryLow, "osReplaceString"); |
2189 | m_host.AddScriptLPS(1); | 2190 | m_host.AddScriptLPS(1); |
2190 | 2191 | ||
2191 | // Normalize indices (if negative). | 2192 | // Normalize indices (if negative). |
@@ -2480,7 +2481,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2480 | return; | 2481 | return; |
2481 | 2482 | ||
2482 | Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); | 2483 | Vector3 pos = new Vector3((float) position.x, (float) position.y, (float) position.z); |
2483 | module.MoveToTarget(npcId, World, pos, false, true); | 2484 | module.MoveToTarget(npcId, World, pos, false, true, false); |
2484 | } | 2485 | } |
2485 | } | 2486 | } |
2486 | 2487 | ||
@@ -2505,7 +2506,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2505 | World, | 2506 | World, |
2506 | pos, | 2507 | pos, |
2507 | (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, | 2508 | (options & ScriptBaseClass.OS_NPC_NO_FLY) != 0, |
2508 | (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0); | 2509 | (options & ScriptBaseClass.OS_NPC_LAND_AT_TARGET) != 0, |
2510 | (options & ScriptBaseClass.OS_NPC_RUNNING) != 0); | ||
2509 | } | 2511 | } |
2510 | } | 2512 | } |
2511 | 2513 | ||
@@ -2555,7 +2557,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2555 | 2557 | ||
2556 | public void osNpcStopMoveToTarget(LSL_Key npc) | 2558 | public void osNpcStopMoveToTarget(LSL_Key npc) |
2557 | { | 2559 | { |
2558 | CheckThreatLevel(ThreatLevel.VeryLow, "osNpcStopMoveTo"); | 2560 | CheckThreatLevel(ThreatLevel.High, "osNpcStopMoveToTarget"); |
2559 | m_host.AddScriptLPS(1); | 2561 | m_host.AddScriptLPS(1); |
2560 | 2562 | ||
2561 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | 2563 | INPCModule module = World.RequestModuleInterface<INPCModule>(); |
@@ -2572,6 +2574,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2572 | 2574 | ||
2573 | public void osNpcSay(LSL_Key npc, string message) | 2575 | public void osNpcSay(LSL_Key npc, string message) |
2574 | { | 2576 | { |
2577 | osNpcSay(npc, 0, message); | ||
2578 | } | ||
2579 | |||
2580 | public void osNpcSay(LSL_Key npc, int channel, string message) | ||
2581 | { | ||
2575 | CheckThreatLevel(ThreatLevel.High, "osNpcSay"); | 2582 | CheckThreatLevel(ThreatLevel.High, "osNpcSay"); |
2576 | m_host.AddScriptLPS(1); | 2583 | m_host.AddScriptLPS(1); |
2577 | 2584 | ||
@@ -2583,7 +2590,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2583 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | 2590 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) |
2584 | return; | 2591 | return; |
2585 | 2592 | ||
2586 | module.Say(npcId, World, message); | 2593 | module.Say(npcId, World, message, channel); |
2594 | } | ||
2595 | } | ||
2596 | |||
2597 | public void osNpcShout(LSL_Key npc, int channel, string message) | ||
2598 | { | ||
2599 | CheckThreatLevel(ThreatLevel.High, "osNpcShout"); | ||
2600 | m_host.AddScriptLPS(1); | ||
2601 | |||
2602 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
2603 | if (module != null) | ||
2604 | { | ||
2605 | UUID npcId = new UUID(npc.m_string); | ||
2606 | |||
2607 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | ||
2608 | return; | ||
2609 | |||
2610 | module.Shout(npcId, World, message, channel); | ||
2587 | } | 2611 | } |
2588 | } | 2612 | } |
2589 | 2613 | ||
@@ -2684,6 +2708,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2684 | } | 2708 | } |
2685 | } | 2709 | } |
2686 | 2710 | ||
2711 | public void osNpcWhisper(LSL_Key npc, int channel, string message) | ||
2712 | { | ||
2713 | CheckThreatLevel(ThreatLevel.High, "osNpcWhisper"); | ||
2714 | m_host.AddScriptLPS(1); | ||
2715 | |||
2716 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
2717 | if (module != null) | ||
2718 | { | ||
2719 | UUID npcId = new UUID(npc.m_string); | ||
2720 | |||
2721 | if (!module.CheckPermissions(npcId, m_host.OwnerID)) | ||
2722 | return; | ||
2723 | |||
2724 | module.Whisper(npcId, World, message, channel); | ||
2725 | } | ||
2726 | } | ||
2727 | |||
2728 | public void osNpcTouch(LSL_Key npcLSL_Key, LSL_Key object_key, LSL_Integer link_num) | ||
2729 | { | ||
2730 | CheckThreatLevel(ThreatLevel.High, "osNpcTouch"); | ||
2731 | m_host.AddScriptLPS(1); | ||
2732 | INPCModule module = World.RequestModuleInterface<INPCModule>(); | ||
2733 | int linkNum = link_num.value; | ||
2734 | if (module != null || (linkNum < 0 && linkNum != ScriptBaseClass.LINK_THIS)) | ||
2735 | { | ||
2736 | UUID npcId; | ||
2737 | if (!UUID.TryParse(npcLSL_Key, out npcId) || !module.CheckPermissions(npcId, m_host.OwnerID)) | ||
2738 | return; | ||
2739 | SceneObjectPart part = null; | ||
2740 | UUID objectId; | ||
2741 | if (UUID.TryParse(LSL_String.ToString(object_key), out objectId)) | ||
2742 | part = World.GetSceneObjectPart(objectId); | ||
2743 | if (part == null) | ||
2744 | return; | ||
2745 | if (linkNum != ScriptBaseClass.LINK_THIS) | ||
2746 | { | ||
2747 | if (linkNum == 0 || linkNum == ScriptBaseClass.LINK_ROOT) | ||
2748 | { // 0 and 1 are treated as root, find the root if the current part isnt it | ||
2749 | if (!part.IsRoot) | ||
2750 | part = part.ParentGroup.RootPart; | ||
2751 | } | ||
2752 | else | ||
2753 | { // Find the prim with the given link number if not found then fail silently | ||
2754 | part = part.ParentGroup.GetLinkNumPart(linkNum); | ||
2755 | if (part == null) | ||
2756 | return; | ||
2757 | } | ||
2758 | } | ||
2759 | module.Touch(npcId, part.UUID); | ||
2760 | } | ||
2761 | } | ||
2762 | |||
2687 | /// <summary> | 2763 | /// <summary> |
2688 | /// Save the current appearance of the script owner permanently to the named notecard. | 2764 | /// Save the current appearance of the script owner permanently to the named notecard. |
2689 | /// </summary> | 2765 | /// </summary> |
@@ -2835,21 +2911,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2835 | CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); | 2911 | CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); |
2836 | m_host.AddScriptLPS(1); | 2912 | m_host.AddScriptLPS(1); |
2837 | 2913 | ||
2838 | if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) | 2914 | World.ForEachRootScenePresence(delegate(ScenePresence sp) |
2839 | { | 2915 | { |
2840 | World.ForEachRootScenePresence(delegate(ScenePresence sp) | 2916 | if (sp.Firstname == FirstName && sp.Lastname == SurName) |
2841 | { | 2917 | { |
2842 | if (sp.Firstname == FirstName && sp.Lastname == SurName) | 2918 | // kick client... |
2843 | { | 2919 | if (alert != null) |
2844 | // kick client... | 2920 | sp.ControllingClient.Kick(alert); |
2845 | if (alert != null) | ||
2846 | sp.ControllingClient.Kick(alert); | ||
2847 | 2921 | ||
2848 | // ...and close on our side | 2922 | // ...and close on our side |
2849 | sp.Scene.IncomingCloseAgent(sp.UUID); | 2923 | sp.Scene.IncomingCloseAgent(sp.UUID); |
2850 | } | 2924 | } |
2851 | }); | 2925 | }); |
2852 | } | ||
2853 | } | 2926 | } |
2854 | 2927 | ||
2855 | public void osCauseDamage(string avatar, double damage) | 2928 | public void osCauseDamage(string avatar, double damage) |
@@ -3095,5 +3168,151 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3095 | 3168 | ||
3096 | return ScriptBaseClass.TRUE; | 3169 | return ScriptBaseClass.TRUE; |
3097 | } | 3170 | } |
3171 | |||
3172 | /// <summary> | ||
3173 | /// Sets terrain estate texture | ||
3174 | /// </summary> | ||
3175 | /// <param name="level"></param> | ||
3176 | /// <param name="texture"></param> | ||
3177 | /// <returns></returns> | ||
3178 | public void osSetTerrainTexture(int level, LSL_Key texture) | ||
3179 | { | ||
3180 | CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture"); | ||
3181 | |||
3182 | m_host.AddScriptLPS(1); | ||
3183 | //Check to make sure that the script's owner is the estate manager/master | ||
3184 | //World.Permissions.GenericEstatePermission( | ||
3185 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
3186 | { | ||
3187 | if (level < 0 || level > 3) | ||
3188 | return; | ||
3189 | |||
3190 | UUID textureID = new UUID(); | ||
3191 | if (!UUID.TryParse(texture, out textureID)) | ||
3192 | return; | ||
3193 | |||
3194 | // estate module is required | ||
3195 | IEstateModule estate = World.RequestModuleInterface<IEstateModule>(); | ||
3196 | if (estate != null) | ||
3197 | estate.setEstateTerrainBaseTexture(level, textureID); | ||
3198 | } | ||
3199 | } | ||
3200 | |||
3201 | /// <summary> | ||
3202 | /// Sets terrain heights of estate | ||
3203 | /// </summary> | ||
3204 | /// <param name="corner"></param> | ||
3205 | /// <param name="low"></param> | ||
3206 | /// <param name="high"></param> | ||
3207 | /// <returns></returns> | ||
3208 | public void osSetTerrainTextureHeight(int corner, double low, double high) | ||
3209 | { | ||
3210 | CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight"); | ||
3211 | |||
3212 | m_host.AddScriptLPS(1); | ||
3213 | //Check to make sure that the script's owner is the estate manager/master | ||
3214 | //World.Permissions.GenericEstatePermission( | ||
3215 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
3216 | { | ||
3217 | if (corner < 0 || corner > 3) | ||
3218 | return; | ||
3219 | |||
3220 | // estate module is required | ||
3221 | IEstateModule estate = World.RequestModuleInterface<IEstateModule>(); | ||
3222 | if (estate != null) | ||
3223 | estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high); | ||
3224 | } | ||
3225 | } | ||
3226 | |||
3227 | public void osForceAttachToAvatar(int attachmentPoint) | ||
3228 | { | ||
3229 | CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar"); | ||
3230 | |||
3231 | m_host.AddScriptLPS(1); | ||
3232 | |||
3233 | InitLSL(); | ||
3234 | ((LSL_Api)m_LSL_Api).AttachToAvatar(attachmentPoint); | ||
3235 | } | ||
3236 | |||
3237 | public void osForceAttachToAvatarFromInventory(string itemName, int attachmentPoint) | ||
3238 | { | ||
3239 | CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatarFromInventory"); | ||
3240 | |||
3241 | m_host.AddScriptLPS(1); | ||
3242 | |||
3243 | ForceAttachToAvatarFromInventory(m_host.OwnerID, itemName, attachmentPoint); | ||
3244 | } | ||
3245 | |||
3246 | public void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint) | ||
3247 | { | ||
3248 | CheckThreatLevel(ThreatLevel.Severe, "osForceAttachToOtherAvatarFromInventory"); | ||
3249 | |||
3250 | m_host.AddScriptLPS(1); | ||
3251 | |||
3252 | UUID avatarId; | ||
3253 | |||
3254 | if (!UUID.TryParse(rawAvatarId, out avatarId)) | ||
3255 | return; | ||
3256 | |||
3257 | ForceAttachToAvatarFromInventory(avatarId, itemName, attachmentPoint); | ||
3258 | } | ||
3259 | |||
3260 | public void ForceAttachToAvatarFromInventory(UUID avatarId, string itemName, int attachmentPoint) | ||
3261 | { | ||
3262 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; | ||
3263 | |||
3264 | if (attachmentsModule == null) | ||
3265 | return; | ||
3266 | |||
3267 | InitLSL(); | ||
3268 | |||
3269 | TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName); | ||
3270 | |||
3271 | if (item == null) | ||
3272 | { | ||
3273 | ((LSL_Api)m_LSL_Api).llSay(0, string.Format("Could not find object '{0}'", itemName)); | ||
3274 | throw new Exception(String.Format("The inventory item '{0}' could not be found", itemName)); | ||
3275 | } | ||
3276 | |||
3277 | if (item.InvType != (int)InventoryType.Object) | ||
3278 | { | ||
3279 | // FIXME: Temporary null check for regression tests since they dont' have the infrastructure to set | ||
3280 | // up the api reference. | ||
3281 | if (m_LSL_Api != null) | ||
3282 | ((LSL_Api)m_LSL_Api).llSay(0, string.Format("Unable to attach, item '{0}' is not an object.", itemName)); | ||
3283 | |||
3284 | throw new Exception(String.Format("The inventory item '{0}' is not an object", itemName)); | ||
3285 | |||
3286 | return; | ||
3287 | } | ||
3288 | |||
3289 | ScenePresence sp = World.GetScenePresence(avatarId); | ||
3290 | |||
3291 | if (sp == null) | ||
3292 | return; | ||
3293 | |||
3294 | InventoryItemBase newItem = World.MoveTaskInventoryItem(sp.UUID, UUID.Zero, m_host, item.ItemID); | ||
3295 | |||
3296 | if (newItem == null) | ||
3297 | { | ||
3298 | m_log.ErrorFormat( | ||
3299 | "[OSSL API]: Could not create user inventory item {0} for {1}, attach point {2} in {3}", | ||
3300 | itemName, m_host.Name, attachmentPoint, World.Name); | ||
3301 | |||
3302 | return; | ||
3303 | } | ||
3304 | |||
3305 | attachmentsModule.RezSingleAttachmentFromInventory(sp, newItem.ID, (uint)attachmentPoint); | ||
3306 | } | ||
3307 | |||
3308 | public void osForceDetachFromAvatar() | ||
3309 | { | ||
3310 | CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar"); | ||
3311 | |||
3312 | m_host.AddScriptLPS(1); | ||
3313 | |||
3314 | InitLSL(); | ||
3315 | ((LSL_Api)m_LSL_Api).DetachFromAvatar(); | ||
3316 | } | ||
3098 | } | 3317 | } |
3099 | } | 3318 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index 1373971..19f3ce1 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs | |||
@@ -308,7 +308,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
308 | } | 308 | } |
309 | SceneObjectPart SensePoint = ts.host; | 309 | SceneObjectPart SensePoint = ts.host; |
310 | 310 | ||
311 | Vector3 fromRegionPos = SensePoint.AbsolutePosition; | 311 | Vector3 fromRegionPos = SensePoint.GetWorldPosition(); |
312 | 312 | ||
313 | // pre define some things to avoid repeated definitions in the loop body | 313 | // pre define some things to avoid repeated definitions in the loop body |
314 | Vector3 toRegionPos; | 314 | Vector3 toRegionPos; |
@@ -323,13 +323,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
323 | Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation! | 323 | Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation! |
324 | if (SensePoint.ParentGroup.IsAttachment) | 324 | if (SensePoint.ParentGroup.IsAttachment) |
325 | { | 325 | { |
326 | // In attachments, the sensor cone always orients with the | 326 | // In attachments, rotate the sensor cone with the |
327 | // avatar rotation. This may include a nonzero elevation if | 327 | // avatar rotation. This may include a nonzero elevation if |
328 | // in mouselook. | 328 | // in mouselook. |
329 | // This will not include the rotation and position of the | ||
330 | // attachment point (e.g. your head when a sensor is in your | ||
331 | // hair attached to your scull. Your hair will turn with | ||
332 | // your head but the sensor will stay with your (global) | ||
333 | // avatar rotation and position. | ||
334 | // Position of a sensor in a child prim attached to an avatar | ||
335 | // will be still wrong. | ||
329 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); | 336 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); |
330 | fromRegionPos = avatar.AbsolutePosition; | 337 | fromRegionPos = avatar.AbsolutePosition; |
331 | q = avatar.Rotation; | 338 | q = avatar.Rotation; |
332 | } | 339 | } |
340 | |||
333 | LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | 341 | LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); |
334 | LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); | 342 | LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); |
335 | double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); | 343 | double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); |
@@ -441,14 +449,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
441 | return sensedEntities; | 449 | return sensedEntities; |
442 | 450 | ||
443 | SceneObjectPart SensePoint = ts.host; | 451 | SceneObjectPart SensePoint = ts.host; |
444 | Vector3 fromRegionPos = SensePoint.AbsolutePosition; | 452 | Vector3 fromRegionPos = SensePoint.GetWorldPosition(); |
445 | 453 | ||
446 | Quaternion q = SensePoint.RotationOffset; | 454 | Quaternion q = SensePoint.GetWorldRotation(); |
447 | if (SensePoint.ParentGroup.IsAttachment) | 455 | if (SensePoint.ParentGroup.IsAttachment) |
448 | { | 456 | { |
449 | // In attachments, the sensor cone always orients with the | 457 | // In attachments, rotate the sensor cone with the |
450 | // avatar rotation. This may include a nonzero elevation if | 458 | // avatar rotation. This may include a nonzero elevation if |
451 | // in mouselook. | 459 | // in mouselook. |
460 | // This will not include the rotation and position of the | ||
461 | // attachment point (e.g. your head when a sensor is in your | ||
462 | // hair attached to your scull. Your hair will turn with | ||
463 | // your head but the sensor will stay with your (global) | ||
464 | // avatar rotation and position. | ||
465 | // Position of a sensor in a child prim attached to an avatar | ||
466 | // will be still wrong. | ||
452 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); | 467 | ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); |
453 | if (avatar == null) | 468 | if (avatar == null) |
454 | return sensedEntities; | 469 | return sensedEntities; |