aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs62
1 files changed, 40 insertions, 22 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index 64dc2e2..cc98bbb 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -93,7 +93,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
93 private const int AGENT = 1; 93 private const int AGENT = 1;
94 private const int AGENT_BY_USERNAME = 0x10; 94 private const int AGENT_BY_USERNAME = 0x10;
95 private const int NPC = 0x20; 95 private const int NPC = 0x20;
96 private const int OS_NPC = 0x01000000;
97 private const int ACTIVE = 2; 96 private const int ACTIVE = 2;
98 private const int PASSIVE = 4; 97 private const int PASSIVE = 4;
99 private const int SCRIPTED = 8; 98 private const int SCRIPTED = 8;
@@ -161,7 +160,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
161 ts.arc = arc; 160 ts.arc = arc;
162 ts.host = host; 161 ts.host = host;
163 162
164 ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); 163 ts.next = DateTime.UtcNow.AddSeconds(ts.interval);
165 164
166 AddSenseRepeater(ts); 165 AddSenseRepeater(ts);
167 } 166 }
@@ -197,14 +196,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
197 public void CheckSenseRepeaterEvents() 196 public void CheckSenseRepeaterEvents()
198 { 197 {
199 // Go through all timers 198 // Go through all timers
200 foreach (SensorInfo ts in SenseRepeaters) 199
200 List<SensorInfo> curSensors;
201 lock(SenseRepeatListLock)
202 curSensors = SenseRepeaters;
203
204 DateTime now = DateTime.UtcNow;
205 foreach (SensorInfo ts in curSensors)
201 { 206 {
202 // Time has passed? 207 // Time has passed?
203 if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) 208 if (ts.next < now)
204 { 209 {
205 SensorSweep(ts); 210 SensorSweep(ts);
206 // set next interval 211 // set next interval
207 ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); 212 ts.next = now.AddSeconds(ts.interval);
208 } 213 }
209 } 214 }
210 } 215 }
@@ -240,7 +245,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
240 List<SensedEntity> sensedEntities = new List<SensedEntity>(); 245 List<SensedEntity> sensedEntities = new List<SensedEntity>();
241 246
242 // Is the sensor type is AGENT and not SCRIPTED then include agents 247 // Is the sensor type is AGENT and not SCRIPTED then include agents
243 if ((ts.type & (AGENT | AGENT_BY_USERNAME | NPC | OS_NPC)) != 0 && (ts.type & SCRIPTED) == 0) 248 if ((ts.type & (AGENT | AGENT_BY_USERNAME | NPC)) != 0 && (ts.type & SCRIPTED) == 0)
244 { 249 {
245 sensedEntities.AddRange(doAgentSensor(ts)); 250 sensedEntities.AddRange(doAgentSensor(ts));
246 } 251 }
@@ -339,7 +344,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
339 float dy; 344 float dy;
340 float dz; 345 float dz;
341 346
342 Quaternion q = SensePoint.GetWorldRotation(); 347// Quaternion q = SensePoint.RotationOffset;
348 Quaternion q = SensePoint.GetWorldRotation(); // non-attached prim Sensor *always* uses World rotation!
343 if (SensePoint.ParentGroup.IsAttachment) 349 if (SensePoint.ParentGroup.IsAttachment)
344 { 350 {
345 // In attachments, rotate the sensor cone with the 351 // In attachments, rotate the sensor cone with the
@@ -351,14 +357,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
351 // your head but the sensor will stay with your (global) 357 // your head but the sensor will stay with your (global)
352 // avatar rotation and position. 358 // avatar rotation and position.
353 // Position of a sensor in a child prim attached to an avatar 359 // Position of a sensor in a child prim attached to an avatar
354 // will be still wrong. 360 // will be still wrong.
355 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 361 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
356 362
357 // Don't proceed if the avatar for this attachment has since been removed from the scene. 363 // Don't proceed if the avatar for this attachment has since been removed from the scene.
358 if (avatar == null) 364 if (avatar == null)
359 return sensedEntities; 365 return sensedEntities;
360 366
361 q = avatar.GetWorldRotation() * q; 367 fromRegionPos = avatar.AbsolutePosition;
368 q = avatar.Rotation;
362 } 369 }
363 370
364 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); 371 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q);
@@ -402,7 +409,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
402 objtype = 0; 409 objtype = 0;
403 410
404 part = ((SceneObjectGroup)ent).RootPart; 411 part = ((SceneObjectGroup)ent).RootPart;
405 if (part.ParentGroup.AttachmentPoint != 0) // Attached so ignore 412 if (part.ParentGroup.RootPart.Shape.PCode != (byte)PCode.Tree &&
413 part.ParentGroup.RootPart.Shape.PCode != (byte)PCode.NewTree &&
414 part.ParentGroup.AttachmentPoint != 0) // Attached so ignore
406 continue; 415 continue;
407 416
408 if (part.Inventory.ContainsScripts()) 417 if (part.Inventory.ContainsScripts())
@@ -470,7 +479,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
470 479
471 SceneObjectPart SensePoint = ts.host; 480 SceneObjectPart SensePoint = ts.host;
472 Vector3 fromRegionPos = SensePoint.GetWorldPosition(); 481 Vector3 fromRegionPos = SensePoint.GetWorldPosition();
473 482
474 Quaternion q = SensePoint.GetWorldRotation(); 483 Quaternion q = SensePoint.GetWorldRotation();
475 if (SensePoint.ParentGroup.IsAttachment) 484 if (SensePoint.ParentGroup.IsAttachment)
476 { 485 {
@@ -483,14 +492,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
483 // your head but the sensor will stay with your (global) 492 // your head but the sensor will stay with your (global)
484 // avatar rotation and position. 493 // avatar rotation and position.
485 // Position of a sensor in a child prim attached to an avatar 494 // Position of a sensor in a child prim attached to an avatar
486 // will be still wrong. 495 // will be still wrong.
487 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); 496 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar);
488 497
489 // Don't proceed if the avatar for this attachment has since been removed from the scene. 498 // Don't proceed if the avatar for this attachment has since been removed from the scene.
490 if (avatar == null) 499 if (avatar == null)
491 return sensedEntities; 500 return sensedEntities;
492 501 fromRegionPos = avatar.AbsolutePosition;
493 q = avatar.GetWorldRotation() * q; 502 q = avatar.Rotation;
494 } 503 }
495 504
496 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); 505 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q);
@@ -499,14 +508,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
499 bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0); 508 bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0);
500 Vector3 toRegionPos; 509 Vector3 toRegionPos;
501 double dis; 510 double dis;
502 511
503 Action<ScenePresence> senseEntity = new Action<ScenePresence>(presence => 512 Action<ScenePresence> senseEntity = new Action<ScenePresence>(presence =>
504 { 513 {
505// m_log.DebugFormat( 514// m_log.DebugFormat(
506// "[SENSOR REPEAT]: Inspecting scene presence {0}, type {1} on sensor sweep for {2}, type {3}", 515// "[SENSOR REPEAT]: Inspecting scene presence {0}, type {1} on sensor sweep for {2}, type {3}",
507// presence.Name, presence.PresenceType, ts.name, ts.type); 516// presence.Name, presence.PresenceType, ts.name, ts.type);
508 517
509 if ((ts.type & NPC) == 0 && (ts.type & OS_NPC) == 0 && presence.PresenceType == PresenceType.Npc) 518 if ((ts.type & NPC) == 0 && presence.PresenceType == PresenceType.Npc)
510 { 519 {
511 INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene); 520 INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene);
512 if (npcData == null || !npcData.SenseAsAgent) 521 if (npcData == null || !npcData.SenseAsAgent)
@@ -537,16 +546,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
537 } 546 }
538 } 547 }
539 548
540 if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) 549 if (presence.IsDeleted || presence.IsChildAgent || presence.IsViewerUIGod)
541 return; 550 return;
542 551
543 // if the object the script is in is attached and the avatar is the owner 552 // if the object the script is in is attached and the avatar is the owner
544 // then this one is not wanted 553 // then this one is not wanted
545 if (attached && presence.UUID == SensePoint.OwnerID) 554 if (attached && presence.UUID == SensePoint.OwnerID)
546 return; 555 return;
547 556
548 toRegionPos = presence.AbsolutePosition; 557 toRegionPos = presence.AbsolutePosition;
549 dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); 558 dis = Util.GetDistanceTo(toRegionPos, fromRegionPos);
559 if (presence.IsSatOnObject && presence.ParentPart != null &&
560 presence.ParentPart.ParentGroup != null &&
561 presence.ParentPart.ParentGroup.RootPart != null)
562 {
563 Vector3 rpos = presence.ParentPart.ParentGroup.RootPart.AbsolutePosition;
564 double dis2 = Util.GetDistanceTo(rpos, fromRegionPos);
565 if (dis > dis2)
566 dis = dis2;
567 }
550 568
551 // Disabled for now since all osNpc* methods check for appropriate ownership permission. 569 // Disabled for now since all osNpc* methods check for appropriate ownership permission.
552 // Perhaps could be re-enabled as an NPC setting at some point since being able to make NPCs not 570 // Perhaps could be re-enabled as an NPC setting at some point since being able to make NPCs not
@@ -688,7 +706,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
688 DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); 706 DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
689 707
690 AddSenseRepeater(ts); 708 AddSenseRepeater(ts);
691 709
692 idx += 6; 710 idx += 6;
693 } 711 }
694 } 712 }
@@ -704,6 +722,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
704 } 722 }
705 723
706 return retList; 724 return retList;
707 } 725 }
708 } 726 }
709} \ No newline at end of file 727}