diff options
-rw-r--r-- | CONTRIBUTORS.txt | 3 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | 144 | ||||
-rw-r--r-- | OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs | 275 |
3 files changed, 399 insertions, 23 deletions
diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 6658928..58bef0c 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt | |||
@@ -34,7 +34,8 @@ Patches | |||
34 | * BigFootAg | 34 | * BigFootAg |
35 | * CharlieO | 35 | * CharlieO |
36 | * jhurliman (LLSD Login) | 36 | * jhurliman (LLSD Login) |
37 | * kinoc | 37 | * kinoc (Daxtron Labs) |
38 | * dmiles (Daxtron Labs) | ||
38 | * daTwitch | 39 | * daTwitch |
39 | * mikkopa/_someone - RealXtend | 40 | * mikkopa/_someone - RealXtend |
40 | * openlifegrid.com | 41 | * openlifegrid.com |
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index b2f2d59..f9bcc06 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections; | ||
30 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
31 | using System.Runtime.Remoting.Lifetime; | 32 | using System.Runtime.Remoting.Lifetime; |
32 | using System.Text; | 33 | using System.Text; |
@@ -362,64 +363,163 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
362 | public void llSensor(string name, string id, int type, double range, double arc) | 363 | public void llSensor(string name, string id, int type, double range, double arc) |
363 | { | 364 | { |
364 | m_host.AddScriptLPS(1); | 365 | m_host.AddScriptLPS(1); |
365 | NotImplemented("llSensor"); | 366 | LLUUID keyID = LLUUID.Zero; |
367 | try | ||
368 | { | ||
369 | if (id.Length > 0) keyID = new LLUUID(id); | ||
370 | } | ||
371 | catch | ||
372 | { | ||
373 | } | ||
374 | m_ScriptEngine.m_ASYNCLSLCommandManager.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); | ||
375 | |||
366 | return; | 376 | return; |
367 | } | 377 | // NotImplemented("llSensor"); |
378 | } | ||
368 | 379 | ||
369 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | 380 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) |
370 | { | 381 | { |
371 | m_host.AddScriptLPS(1); | 382 | m_host.AddScriptLPS(1); |
372 | NotImplemented("llSensorRepeat"); | 383 | LLUUID keyID = LLUUID.Zero; |
384 | try | ||
385 | { | ||
386 | if (id.Length > 0) keyID = new LLUUID(id); | ||
387 | } | ||
388 | catch | ||
389 | { | ||
390 | } | ||
391 | |||
392 | m_ScriptEngine.m_ASYNCLSLCommandManager.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); | ||
373 | return; | 393 | return; |
374 | } | 394 | // NotImplemented("llSensorRepeat"); |
395 | } | ||
375 | 396 | ||
376 | public void llSensorRemove() | 397 | public void llSensorRemove() |
377 | { | 398 | { |
378 | m_host.AddScriptLPS(1); | 399 | m_host.AddScriptLPS(1); |
379 | NotImplemented("llSensorRemove"); | 400 | m_ScriptEngine.m_ASYNCLSLCommandManager.UnSetSenseRepeaterEvents(m_localID, m_itemID); |
380 | return; | 401 | return; |
402 | // NotImplemented("llSensorRemove"); | ||
381 | } | 403 | } |
382 | 404 | ||
383 | public string llDetectedName(int number) | 405 | public string llDetectedName(int number) |
384 | { | 406 | { |
385 | m_host.AddScriptLPS(1); | 407 | m_host.AddScriptLPS(1); |
386 | NotImplemented("llDetectedName"); | 408 | LSL_Types.list SenseList = m_ScriptEngine.m_ASYNCLSLCommandManager.GetSensorList(m_localID, m_itemID); |
387 | return String.Empty; | 409 | if ((number>0)&&(number <= SenseList.Length)) |
410 | { | ||
411 | LLUUID SensedUUID = (LLUUID)SenseList.Data[number]; | ||
412 | //ScenePresence SensedObject = World.GetScenePresence(SensedUUID); | ||
413 | EntityBase SensedObject=null; | ||
414 | lock (World.Entities) | ||
415 | { | ||
416 | World.Entities.TryGetValue(SensedUUID, out SensedObject); | ||
417 | } | ||
418 | |||
419 | if (SensedObject == null) | ||
420 | return String.Empty; | ||
421 | return SensedObject.Name; | ||
422 | } | ||
423 | else | ||
424 | return String.Empty; | ||
425 | //NotImplemented("llDetectedName"); | ||
426 | } | ||
427 | |||
428 | public LLUUID uuidDetectedKey(int number) | ||
429 | { | ||
430 | LSL_Types.list SenseList = m_ScriptEngine.m_ASYNCLSLCommandManager.GetSensorList(m_localID, m_itemID); | ||
431 | if ((number >= 0) && (number < SenseList.Length)) | ||
432 | { | ||
433 | LLUUID SensedUUID = (LLUUID)SenseList.Data[number]; | ||
434 | return SensedUUID; | ||
435 | } | ||
436 | return LLUUID.Zero; | ||
437 | } | ||
438 | |||
439 | public EntityBase entityDetectedKey(int number) | ||
440 | { | ||
441 | LSL_Types.list SenseList = m_ScriptEngine.m_ASYNCLSLCommandManager.GetSensorList(m_localID, m_itemID); | ||
442 | if ((number >= 0) && (number < SenseList.Length)) | ||
443 | { | ||
444 | LLUUID SensedUUID = (LLUUID)SenseList.Data[number]; | ||
445 | EntityBase SensedObject = null; | ||
446 | lock (World.Entities) | ||
447 | { | ||
448 | World.Entities.TryGetValue(SensedUUID, out SensedObject); | ||
449 | } | ||
450 | return SensedObject; | ||
451 | } | ||
452 | return null; | ||
388 | } | 453 | } |
389 | 454 | ||
390 | public string llDetectedKey(int number) | 455 | public string llDetectedKey(int number) |
391 | { | 456 | { |
392 | m_host.AddScriptLPS(1); | 457 | m_host.AddScriptLPS(1); |
393 | NotImplemented("llDetectedKey"); | 458 | LLUUID SensedUUID = uuidDetectedKey(number); |
394 | return String.Empty; | 459 | if (SensedUUID == LLUUID.Zero) |
460 | return String.Empty; | ||
461 | |||
462 | return SensedUUID.ToString(); | ||
395 | } | 463 | } |
396 | 464 | ||
397 | public string llDetectedOwner(int number) | 465 | public string llDetectedOwner(int number) |
398 | { | 466 | { |
399 | m_host.AddScriptLPS(1); | 467 | m_host.AddScriptLPS(1); |
400 | NotImplemented("llDetectedOwner"); | 468 | EntityBase SensedObject = entityDetectedKey(number); |
469 | if (SensedObject ==null) | ||
470 | return String.Empty; | ||
471 | //return SensedObject.O .Name; // What is the owner of the object ? | ||
472 | //EntityBase SensedObject = World.GetScenePresence(SensedUUID); | ||
473 | LLUUID SensedUUID = uuidDetectedKey(number); | ||
474 | SceneObjectPart SOP = World.GetSceneObjectPart(SensedUUID); | ||
475 | if (SOP != null) { return SOP.ObjectOwner.ToString(); } | ||
401 | return String.Empty; | 476 | return String.Empty; |
402 | } | 477 | |
478 | } | ||
403 | 479 | ||
404 | public int llDetectedType(int number) | 480 | public int llDetectedType(int number) |
405 | { | 481 | { |
406 | m_host.AddScriptLPS(1); | 482 | m_host.AddScriptLPS(1); |
407 | NotImplemented("llDetectedType"); | 483 | EntityBase SensedObject = entityDetectedKey(number); |
408 | return 0; | 484 | if (SensedObject == null) |
485 | return 0; | ||
486 | int mask = 0; | ||
487 | |||
488 | LLUUID SensedUUID = uuidDetectedKey(number); | ||
489 | LSL_Types.Vector3 ZeroVector = new LSL_Types.Vector3(0, 0, 0); | ||
490 | |||
491 | if (World.GetScenePresence(SensedUUID) != null) mask |= 0x01; // actor | ||
492 | if (SensedObject.Velocity.Equals(ZeroVector)) | ||
493 | mask |= 0x04; // passive non-moving | ||
494 | else | ||
495 | mask |= 0x02; // active moving | ||
496 | if (SensedObject is IScript) mask |= 0x08; // Scripted. It COULD have one hidden ... | ||
497 | return mask; | ||
498 | |||
409 | } | 499 | } |
410 | 500 | ||
411 | public LSL_Types.Vector3 llDetectedPos(int number) | 501 | public LSL_Types.Vector3 llDetectedPos(int number) |
412 | { | 502 | { |
413 | m_host.AddScriptLPS(1); | 503 | m_host.AddScriptLPS(1); |
414 | NotImplemented("llDetectedPos"); | 504 | EntityBase SensedObject = entityDetectedKey(number); |
415 | return new LSL_Types.Vector3(); | 505 | if (SensedObject == null) |
506 | return new LSL_Types.Vector3(0, 0, 0); | ||
507 | |||
508 | return new LSL_Types.Vector3(SensedObject.AbsolutePosition.X,SensedObject.AbsolutePosition.Y,SensedObject.AbsolutePosition.Z); | ||
509 | |||
510 | //NotImplemented("llDetectedPos"); | ||
416 | } | 511 | } |
417 | 512 | ||
418 | public LSL_Types.Vector3 llDetectedVel(int number) | 513 | public LSL_Types.Vector3 llDetectedVel(int number) |
419 | { | 514 | { |
420 | m_host.AddScriptLPS(1); | 515 | m_host.AddScriptLPS(1); |
421 | NotImplemented("llDetectedVel"); | 516 | EntityBase SensedObject = entityDetectedKey(number); |
422 | return new LSL_Types.Vector3(); | 517 | if (SensedObject == null) |
518 | return new LSL_Types.Vector3(0, 0, 0); | ||
519 | |||
520 | return new LSL_Types.Vector3(SensedObject.Velocity.X, SensedObject.Velocity.Y, SensedObject.Velocity.Z); | ||
521 | // NotImplemented("llDetectedVel"); | ||
522 | // return new LSL_Types.Vector3(); | ||
423 | } | 523 | } |
424 | 524 | ||
425 | public LSL_Types.Vector3 llDetectedGrab(int number) | 525 | public LSL_Types.Vector3 llDetectedGrab(int number) |
@@ -432,8 +532,11 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
432 | public LSL_Types.Quaternion llDetectedRot(int number) | 532 | public LSL_Types.Quaternion llDetectedRot(int number) |
433 | { | 533 | { |
434 | m_host.AddScriptLPS(1); | 534 | m_host.AddScriptLPS(1); |
435 | NotImplemented("llDetectedRot"); | 535 | EntityBase SensedObject = entityDetectedKey(number); |
436 | return new LSL_Types.Quaternion(); | 536 | if (SensedObject == null) |
537 | return new LSL_Types.Quaternion(); | ||
538 | |||
539 | return new LSL_Types.Quaternion(SensedObject.Rotation.x, SensedObject.Rotation.y, SensedObject.Rotation.z, SensedObject.Rotation.w); | ||
437 | } | 540 | } |
438 | 541 | ||
439 | public int llDetectedGroup(int number) | 542 | public int llDetectedGroup(int number) |
@@ -2401,6 +2504,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
2401 | ret.Add(str); | 2504 | ret.Add(str); |
2402 | } | 2505 | } |
2403 | return ret; | 2506 | return ret; |
2507 | |||
2404 | } | 2508 | } |
2405 | 2509 | ||
2406 | public int llOverMyLand(string id) | 2510 | public int llOverMyLand(string id) |
@@ -3222,6 +3326,8 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
3222 | { | 3326 | { |
3223 | m_host.AddScriptLPS(1); | 3327 | m_host.AddScriptLPS(1); |
3224 | //temp fix so that lsl wiki examples aren't annoying to use to test other functions | 3328 | //temp fix so that lsl wiki examples aren't annoying to use to test other functions |
3329 | //should be similar to : llInstantMessage(llGetOwner(),msg) | ||
3330 | // llGetOwner ==> m_host.ObjectOwner.ToString() | ||
3225 | World.SimChat(Helpers.StringToField(msg), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | 3331 | World.SimChat(Helpers.StringToField(msg), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID); |
3226 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 3332 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
3227 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, 0, m_host.Name, msg); | 3333 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, 0, m_host.Name, msg); |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs index 33c6511..5013ab8 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AsyncLSLCommandManager.cs | |||
@@ -31,8 +31,11 @@ using System.Collections; | |||
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Threading; | 32 | using System.Threading; |
33 | using libsecondlife; | 33 | using libsecondlife; |
34 | using Axiom.Math; | ||
34 | using OpenSim.Region.Environment.Interfaces; | 35 | using OpenSim.Region.Environment.Interfaces; |
35 | using OpenSim.Region.Environment.Modules; | 36 | using OpenSim.Region.Environment.Modules; |
37 | using OpenSim.Region.Environment.Scenes; | ||
38 | using OpenSim.Framework; | ||
36 | 39 | ||
37 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | 40 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase |
38 | { | 41 | { |
@@ -46,6 +49,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
46 | 49 | ||
47 | private ScriptEngine m_ScriptEngine; | 50 | private ScriptEngine m_ScriptEngine; |
48 | 51 | ||
52 | public Dictionary<uint, Dictionary<LLUUID, LSL_Types.list>> SenseEvents = | ||
53 | new Dictionary<uint, Dictionary<LLUUID, LSL_Types.list>>(); | ||
54 | private Object SenseLock = new Object(); | ||
55 | |||
49 | public AsyncLSLCommandManager(ScriptEngine _ScriptEngine) | 56 | public AsyncLSLCommandManager(ScriptEngine _ScriptEngine) |
50 | { | 57 | { |
51 | m_ScriptEngine = _ScriptEngine; | 58 | m_ScriptEngine = _ScriptEngine; |
@@ -128,6 +135,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
128 | CheckXMLRPCRequests(); | 135 | CheckXMLRPCRequests(); |
129 | // Check Listeners | 136 | // Check Listeners |
130 | CheckListeners(); | 137 | CheckListeners(); |
138 | // Check Sensors | ||
139 | CheckSenseRepeaterEvents(); | ||
131 | } | 140 | } |
132 | 141 | ||
133 | /// <summary> | 142 | /// <summary> |
@@ -154,6 +163,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
154 | 163 | ||
155 | xmlrpc.CancelSRDRequests(itemID); | 164 | xmlrpc.CancelSRDRequests(itemID); |
156 | 165 | ||
166 | // Remove Sensors | ||
167 | UnSetSenseRepeaterEvents(localID, itemID); | ||
168 | |||
157 | } | 169 | } |
158 | 170 | ||
159 | #region TIMER | 171 | #region TIMER |
@@ -253,6 +265,262 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
253 | } | 265 | } |
254 | 266 | ||
255 | #endregion | 267 | #endregion |
268 | #region SENSOR | ||
269 | |||
270 | // | ||
271 | // SenseRepeater and Sensors | ||
272 | // | ||
273 | private class SenseRepeatClass | ||
274 | { | ||
275 | public uint localID; | ||
276 | public LLUUID itemID; | ||
277 | public double interval; | ||
278 | public DateTime next; | ||
279 | |||
280 | public string name; | ||
281 | public LLUUID keyID; | ||
282 | public int type; | ||
283 | public double range; | ||
284 | public double arc; | ||
285 | public SceneObjectPart host; | ||
286 | } | ||
287 | |||
288 | private List<SenseRepeatClass> SenseRepeaters = new List<SenseRepeatClass>(); | ||
289 | private object SenseRepeatListLock = new object(); | ||
290 | |||
291 | public void SetSenseRepeatEvent(uint m_localID, LLUUID m_itemID, | ||
292 | string name, LLUUID keyID, int type, double range, double arc, double sec,SceneObjectPart host) | ||
293 | { | ||
294 | Console.WriteLine("SetSensorEvent"); | ||
295 | |||
296 | // Always remove first, in case this is a re-set | ||
297 | UnSetSenseRepeaterEvents(m_localID, m_itemID); | ||
298 | if (sec == 0) // Disabling timer | ||
299 | return; | ||
300 | |||
301 | // Add to timer | ||
302 | SenseRepeatClass ts = new SenseRepeatClass(); | ||
303 | ts.localID = m_localID; | ||
304 | ts.itemID = m_itemID; | ||
305 | ts.interval = sec; | ||
306 | ts.name = name; | ||
307 | ts.keyID = keyID; | ||
308 | ts.type = type; | ||
309 | ts.range = range; | ||
310 | ts.arc = arc; | ||
311 | ts.host = host; | ||
312 | |||
313 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
314 | lock (SenseRepeatListLock) | ||
315 | { | ||
316 | SenseRepeaters.Add(ts); | ||
317 | } | ||
318 | } | ||
319 | |||
320 | public void UnSetSenseRepeaterEvents(uint m_localID, LLUUID m_itemID) | ||
321 | { | ||
322 | // Remove from timer | ||
323 | lock (SenseRepeatListLock) | ||
324 | { | ||
325 | List<SenseRepeatClass> NewSensors = new List<SenseRepeatClass>(); | ||
326 | foreach (SenseRepeatClass ts in SenseRepeaters) | ||
327 | { | ||
328 | if (ts.localID != m_localID && ts.itemID != m_itemID) | ||
329 | { | ||
330 | NewSensors.Add(ts); | ||
331 | } | ||
332 | } | ||
333 | SenseRepeaters.Clear(); | ||
334 | SenseRepeaters = NewSensors; | ||
335 | } | ||
336 | } | ||
337 | |||
338 | public void CheckSenseRepeaterEvents() | ||
339 | { | ||
340 | // Nothing to do here? | ||
341 | if (SenseRepeaters.Count == 0) | ||
342 | return; | ||
343 | |||
344 | lock (SenseRepeatListLock) | ||
345 | { | ||
346 | // Go through all timers | ||
347 | foreach (SenseRepeatClass ts in SenseRepeaters) | ||
348 | { | ||
349 | // Time has passed? | ||
350 | if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) | ||
351 | { | ||
352 | SensorSweep(ts); | ||
353 | // set next interval | ||
354 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
355 | } | ||
356 | } | ||
357 | } // lock | ||
358 | } | ||
359 | |||
360 | public void SenseOnce(uint m_localID, LLUUID m_itemID, | ||
361 | string name, LLUUID keyID, int type, double range, double arc, SceneObjectPart host) | ||
362 | { | ||
363 | // Add to timer | ||
364 | SenseRepeatClass ts = new SenseRepeatClass(); | ||
365 | ts.localID = m_localID; | ||
366 | ts.itemID = m_itemID; | ||
367 | ts.interval = 0; | ||
368 | ts.name = name; | ||
369 | ts.keyID = keyID; | ||
370 | ts.type = type; | ||
371 | ts.range = range; | ||
372 | ts.arc = arc; | ||
373 | ts.host = host; | ||
374 | SensorSweep(ts); | ||
375 | } | ||
376 | |||
377 | public LSL_Types.list GetSensorList(uint m_localID, LLUUID m_itemID) | ||
378 | { | ||
379 | lock (SenseLock) | ||
380 | { | ||
381 | Dictionary<LLUUID, LSL_Types.list> Obj = null; | ||
382 | if (!SenseEvents.TryGetValue(m_localID, out Obj)) | ||
383 | { | ||
384 | m_ScriptEngine.Log.Info("[AsyncLSL]: GetSensorList missing localID: " + m_localID); | ||
385 | return null; | ||
386 | } | ||
387 | lock (Obj) | ||
388 | { | ||
389 | // Get script | ||
390 | LSL_Types.list SenseList = null; | ||
391 | if (!Obj.TryGetValue(m_itemID, out SenseList)) | ||
392 | { | ||
393 | m_ScriptEngine.Log.Info("[AsyncLSL]: GetSensorList missing itemID: " + m_itemID); | ||
394 | return null; | ||
395 | } | ||
396 | return SenseList; | ||
397 | } | ||
398 | } | ||
399 | |||
400 | } | ||
401 | |||
402 | private void SensorSweep(SenseRepeatClass ts) | ||
403 | { | ||
404 | //m_ScriptEngine.Log.Info("[AsyncLSL]:Enter SensorSweep"); | ||
405 | SceneObjectPart SensePoint =ts.host; | ||
406 | |||
407 | if (SensePoint == null) | ||
408 | { | ||
409 | //m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep (SensePoint == null) for "+ts.itemID.ToString()); | ||
410 | return; | ||
411 | } | ||
412 | //m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep Scan"); | ||
413 | |||
414 | LLVector3 sensorPos = SensePoint.AbsolutePosition; | ||
415 | LLVector3 regionPos = new LLVector3(m_ScriptEngine.World.RegionInfo.RegionLocX * Constants.RegionSize, m_ScriptEngine.World.RegionInfo.RegionLocY * Constants.RegionSize, 0); | ||
416 | LLVector3 fromRegionPos = sensorPos + regionPos; | ||
417 | |||
418 | LLQuaternion q = SensePoint.RotationOffset; | ||
419 | LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | ||
420 | LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); | ||
421 | double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); | ||
422 | |||
423 | // Here we should do some smart culling ... | ||
424 | // math seems quicker than strings so try that first | ||
425 | LSL_Types.list SensedObjects = new LSL_Types.list(); | ||
426 | LSL_Types.Vector3 ZeroVector = new LSL_Types.Vector3(0, 0, 0); | ||
427 | |||
428 | foreach (EntityBase ent in m_ScriptEngine.World.Entities.Values) | ||
429 | { | ||
430 | |||
431 | LLVector3 toRegionPos = ent.AbsolutePosition + regionPos; | ||
432 | double dis = Math.Abs((double) Util.GetDistanceTo(toRegionPos, fromRegionPos)); | ||
433 | if (dis <= ts.range) | ||
434 | { | ||
435 | // In Range, is it the right Type ? | ||
436 | int objtype = 0; | ||
437 | |||
438 | if (m_ScriptEngine.World.GetScenePresence(ent.UUID) != null) objtype |= 0x01; // actor | ||
439 | if (ent.Velocity.Equals(ZeroVector)) | ||
440 | objtype |= 0x04; // passive non-moving | ||
441 | else | ||
442 | objtype |= 0x02; // active moving | ||
443 | if (ent is IScript) objtype |= 0x08; // Scripted. It COULD have one hidden ... | ||
444 | |||
445 | if ( ((ts.type & objtype) != 0 ) ||((ts.type & objtype) == ts.type )) | ||
446 | { | ||
447 | // docs claim AGENT|ACTIVE should find agent objects OR active objects | ||
448 | // so the bitwise AND with object type should be non-zero | ||
449 | |||
450 | // Right type too, what about the other params , key and name ? | ||
451 | bool keep = true; | ||
452 | if (ts.arc != Math.PI) | ||
453 | { | ||
454 | // not omni-directional. Can you see it ? | ||
455 | // vec forward_dir = llRot2Fwd(llGetRot()) | ||
456 | // vec obj_dir = toRegionPos-fromRegionPos | ||
457 | // dot=dot(forward_dir,obj_dir) | ||
458 | // mag_fwd = mag(forward_dir) | ||
459 | // mag_obj = mag(obj_dir) | ||
460 | // ang = acos( dot /(mag_fwd*mag_obj)) | ||
461 | double ang_obj = 0; | ||
462 | try | ||
463 | { | ||
464 | LLVector3 diff =toRegionPos - fromRegionPos; | ||
465 | LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); | ||
466 | double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); | ||
467 | double mag_obj = LSL_Types.Vector3.Mag(obj_dir); | ||
468 | ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); | ||
469 | } | ||
470 | catch | ||
471 | { | ||
472 | } | ||
473 | |||
474 | if (ang_obj > ts.arc) keep = false; | ||
475 | } | ||
476 | |||
477 | if (keep && (ts.name.Length > 0) && (ts.name != ent.Name)) | ||
478 | { | ||
479 | keep = false; | ||
480 | } | ||
481 | |||
482 | if (keep && (ts.keyID != null) && (ts.keyID != LLUUID.Zero) && (ts.keyID != ent.UUID)) | ||
483 | { | ||
484 | keep = false; | ||
485 | } | ||
486 | if (keep==true) SensedObjects.Add(ent.UUID); | ||
487 | } | ||
488 | } | ||
489 | } | ||
490 | //m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep SenseLock"); | ||
491 | |||
492 | lock (SenseLock) | ||
493 | { | ||
494 | // Create object if it doesn't exist | ||
495 | if (SenseEvents.ContainsKey(ts.localID) == false) | ||
496 | { | ||
497 | SenseEvents.Add(ts.localID, new Dictionary<LLUUID, LSL_Types.list>()); | ||
498 | } | ||
499 | // clear if previous traces exist | ||
500 | Dictionary<LLUUID, LSL_Types.list> Obj; | ||
501 | SenseEvents.TryGetValue(ts.localID, out Obj); | ||
502 | if (Obj.ContainsKey(ts.itemID) == true) | ||
503 | Obj.Remove(ts.itemID); | ||
504 | |||
505 | // note list may be zero length | ||
506 | Obj.Add(ts.itemID, SensedObjects); | ||
507 | |||
508 | if (SensedObjects.Length == 0) | ||
509 | { | ||
510 | // send a "no_sensor" | ||
511 | // Add it to queue | ||
512 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "no_sensor", EventQueueManager.llDetectNull, | ||
513 | new object[] {}); | ||
514 | } | ||
515 | else | ||
516 | { | ||
517 | |||
518 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "sensor", EventQueueManager.llDetectNull, | ||
519 | new object[] { SensedObjects.Length }); | ||
520 | } | ||
521 | } | ||
522 | } | ||
523 | #endregion | ||
256 | 524 | ||
257 | #region HTTP REQUEST | 525 | #region HTTP REQUEST |
258 | 526 | ||
@@ -271,7 +539,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
271 | 539 | ||
272 | while (httpInfo != null) | 540 | while (httpInfo != null) |
273 | { | 541 | { |
274 | //Console.WriteLine("PICKED HTTP REQ:" + httpInfo.response_body + httpInfo.status); | 542 | //m_ScriptEngine.Log.Info("[AsyncLSL]:" + httpInfo.response_body + httpInfo.status); |
275 | 543 | ||
276 | // Deliver data to prim's remote_data handler | 544 | // Deliver data to prim's remote_data handler |
277 | // | 545 | // |
@@ -291,7 +559,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
291 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 559 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |
292 | httpInfo.localID, httpInfo.itemID, "http_response", EventQueueManager.llDetectNull, resobj | 560 | httpInfo.localID, httpInfo.itemID, "http_response", EventQueueManager.llDetectNull, resobj |
293 | ); | 561 | ); |
294 | 562 | //Thread.Sleep(2500); | |
295 | } | 563 | } |
296 | 564 | ||
297 | httpInfo = iHttpReq.GetNextCompletedRequest(); | 565 | httpInfo = iHttpReq.GetNextCompletedRequest(); |
@@ -381,7 +649,8 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |||
381 | //Deliver data to prim's listen handler | 649 | //Deliver data to prim's listen handler |
382 | object[] resobj = new object[] | 650 | object[] resobj = new object[] |
383 | { | 651 | { |
384 | lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() | 652 | //lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() |
653 | lInfo.GetChannel(), lInfo.GetName(), lInfo.GetSourceItemID().ToString(), lInfo.GetMessage() | ||
385 | }; | 654 | }; |
386 | 655 | ||
387 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 656 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |