public void CreateFromData(UUID itemID, UUID objectID, OSD data) { ISceneChildEntity part = findPrimsScene(objectID).GetSceneObjectPart( objectID); if (part == null) { return; } OSDMap save = (OSDMap)data; foreach (KeyValuePair <string, OSD> kvp in save) { OSDMap map = (OSDMap)kvp.Value; SenseRepeatClass ts = new SenseRepeatClass(); ts.objectID = objectID; ts.itemID = itemID; ts.interval = (long)map["Interval"].AsInteger(); ts.name = map["Name"].AsString(); ts.keyID = map["ID"].AsUUID(); ts.type = map["Type"].AsInteger(); ts.range = map["Range"].AsReal(); ts.arc = map["Arc"].AsReal(); ts.host = part; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); SenseRepeaters.Add(ts); } }
public void SenseOnce(UUID objectID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, ISceneChildEntity host) { // Add to timer SenseRepeatClass ts = new SenseRepeatClass(); ts.objectID = objectID; ts.itemID = m_itemID; ts.interval = 0; ts.name = name; ts.keyID = keyID; ts.type = type; if (range > maximumRange && usemaximumRange) { ts.range = maximumRange; } else { ts.range = range; } ts.arc = arc; ts.host = host; SensorSweep(ts); }
public void SenseOnce(UUID objectID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, ISceneChildEntity host) { // Add to timer SenseRepeatClass ts = new SenseRepeatClass { objectID = objectID, itemID = m_itemID, interval = 0, name = name, keyID = keyID, type = type }; if (range > maximumRange && usemaximumRange) { ts.range = maximumRange; } else { ts.range = range; } ts.arc = arc; ts.host = host; SensorSweep(ts); //Make sure that the cmd handler thread is running m_ScriptEngine.MaintenanceThread.PokeThreads(ts.itemID); }
public void SenseOnce(uint m_localID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, SceneObjectPart host) { // Add to timer SenseRepeatClass ts = new SenseRepeatClass(); ts.localID = m_localID; ts.itemID = m_itemID; ts.interval = 0; ts.name = name; ts.keyID = keyID; ts.type = type; if (range > maximumRange) { ts.range = maximumRange; } else { ts.range = range; } ts.arc = arc; ts.host = host; SensorSweep(ts); }
private void AddSenseRepeater(SenseRepeatClass senseRepeater) { lock (SenseRepeatListLock) { List <SenseRepeatClass> newSenseRepeaters = new List <SenseRepeatClass>(SenseRepeaters); newSenseRepeaters.Add(senseRepeater); SenseRepeaters = newSenseRepeaters; } }
public void CreateFromData(UUID itemID, UUID objectID, OSD data) { IScene scene = findPrimsScene(objectID); if (scene == null) { return; } ISceneChildEntity part = scene.GetSceneObjectPart( objectID); if (part == null) { return; } OSDMap save = (OSDMap)data; foreach (KeyValuePair <string, OSD> kvp in save) { OSDMap map = (OSDMap)kvp.Value; SenseRepeatClass ts = new SenseRepeatClass { objectID = objectID, itemID = itemID, interval = map["Interval"].AsLong(), name = map["Name"].AsString(), keyID = map["ID"].AsUUID(), type = map["Type"].AsInteger(), range = map["Range"].AsReal(), arc = map["Arc"].AsReal(), host = part }; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); lock (SenseRepeatListLock) SenseRepeaters.Add(ts); } //Make sure that the cmd handler thread is running m_ScriptEngine.MaintenanceThread.PokeThreads(UUID.Zero); }
public void SetSenseRepeatEvent(UUID objectID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, double sec, ISceneChildEntity host) { // Always remove first, in case this is a re-set RemoveScript(objectID, m_itemID); if (sec == 0) // Disabling timer { return; } // Add to timer SenseRepeatClass ts = new SenseRepeatClass { objectID = objectID, itemID = m_itemID, interval = sec, name = name, keyID = keyID, type = type }; if (range > maximumRange && usemaximumRange) { ts.range = maximumRange; } else { ts.range = range; } ts.arc = arc; ts.host = host; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); lock (SenseRepeatListLock) { SenseRepeaters.Add(ts); } //Make sure that the cmd handler thread is running m_ScriptEngine.MaintenanceThread.PokeThreads(ts.itemID); }
public void CreateFromData(uint localID, UUID itemID, UUID objectID, Object[] data) { SceneObjectPart part = m_CmdManager.m_ScriptEngine.World.GetSceneObjectPart( objectID); if (part == null) { return; } int idx = 0; while (idx < data.Length) { SenseRepeatClass ts = new SenseRepeatClass(); ts.localID = localID; ts.itemID = itemID; ts.interval = (double)data[idx]; ts.name = (string)data[idx + 1]; ts.keyID = (UUID)data[idx + 2]; ts.type = (int)data[idx + 3]; ts.range = (double)data[idx + 4]; ts.arc = (double)data[idx + 5]; ts.host = part; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); lock (SenseRepeatListLock) SenseRepeaters.Add(ts); idx += 6; } }
public void SetSenseRepeatEvent(uint m_localID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, double sec, ISceneEntity host) { // Always remove first, in case this is a re-set UnSetSenseRepeaterEvents(m_localID, m_itemID); if (sec == 0) // Disabling timer { return; } // Add to timer SenseRepeatClass ts = new SenseRepeatClass(); ts.localID = m_localID; ts.itemID = m_itemID; ts.interval = sec; ts.name = name; ts.keyID = keyID; ts.type = type; if (range > maximumRange) { ts.range = maximumRange; } else { ts.range = range; } ts.arc = arc; ts.host = host; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); lock (SenseRepeatListLock) { SenseRepeaters.Add(ts); } }
public void SenseOnce(UUID objectID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, ISceneChildEntity host) { // Add to timer SenseRepeatClass ts = new SenseRepeatClass { objectID = objectID, itemID = m_itemID, interval = 0, name = name, keyID = keyID, type = type }; if (range > maximumRange && usemaximumRange) ts.range = maximumRange; else ts.range = range; ts.arc = arc; ts.host = host; SensorSweep(ts); //Make sure that the cmd handler thread is running m_ScriptEngine.MaintenanceThread.PokeThreads(ts.itemID); }
public void SetSenseRepeatEvent(UUID objectID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, double sec, ISceneChildEntity host) { // Always remove first, in case this is a re-set RemoveScript(objectID, m_itemID); if (sec == 0) // Disabling timer return; // Add to timer SenseRepeatClass ts = new SenseRepeatClass { objectID = objectID, itemID = m_itemID, interval = sec, name = name, keyID = keyID, type = type }; if (range > maximumRange && usemaximumRange) ts.range = maximumRange; else ts.range = range; ts.arc = arc; ts.host = host; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); lock (SenseRepeatListLock) { SenseRepeaters.Add(ts); } //Make sure that the cmd handler thread is running m_ScriptEngine.MaintenanceThread.PokeThreads(ts.itemID); }
public void CreateFromData(UUID itemID, UUID objectID, OSD data) { ISceneChildEntity part = m_ScriptEngine.Scene.GetSceneObjectPart( objectID); if (part == null) return; OSDMap save = (OSDMap) data; foreach (KeyValuePair<string, OSD> kvp in save) { OSDMap map = (OSDMap) kvp.Value; SenseRepeatClass ts = new SenseRepeatClass { objectID = objectID, itemID = itemID, interval = map["Interval"].AsLong(), name = map["Name"].AsString(), keyID = map["ID"].AsUUID(), type = map["Type"].AsInteger(), range = map["Range"].AsReal(), arc = map["Arc"].AsReal(), host = part }; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); lock (SenseRepeatListLock) SenseRepeaters.Add(ts); } //Make sure that the cmd handler thread is running m_ScriptEngine.MaintenanceThread.PokeThreads(UUID.Zero); }
public void CreateFromData(uint localID, UUID itemID, UUID objectID, Object[] data) { SceneObjectPart part = m_CmdManager.m_ScriptEngine.World.GetSceneObjectPart( objectID); if (part == null) return; int idx = 0; while (idx < data.Length) { SenseRepeatClass ts = new SenseRepeatClass(); ts.localID = localID; ts.itemID = itemID; ts.interval = (double)data[idx]; ts.name = (string)data[idx+1]; ts.keyID = (UUID)data[idx+2]; ts.type = (int)data[idx+3]; ts.range = (double)data[idx+4]; ts.arc = (double)data[idx+5]; ts.host = part; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); SenseRepeaters.Add(ts); idx += 6; } }
public void SenseOnce(UUID objectID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, SceneObjectPart host) { // Add to timer SenseRepeatClass ts = new SenseRepeatClass(); ts.objectID = objectID; ts.itemID = m_itemID; ts.interval = 0; ts.name = name; ts.keyID = keyID; ts.type = type; if (range > maximumRange && usemaximumRange) ts.range = maximumRange; else ts.range = range; ts.arc = arc; ts.host = host; SensorSweep(ts); }
private List<SensedEntity> doAgentSensor(SenseRepeatClass ts) { List<SensedEntity> sensedEntities = new List<SensedEntity>(); // If nobody about quit fast if (m_CmdManager.m_ScriptEngine.World.GetRootAgentCount() == 0) return sensedEntities; SceneObjectPart SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.GetWorldPosition(); Quaternion q = SensePoint.GetWorldRotation(); if (SensePoint.ParentGroup.IsAttachment) { // In attachments, rotate the sensor cone with the // avatar rotation. This may include a nonzero elevation if // in mouselook. // This will not include the rotation and position of the // attachment point (e.g. your head when a sensor is in your // hair attached to your scull. Your hair will turn with // your head but the sensor will stay with your (global) // avatar rotation and position. // Position of a sensor in a child prim attached to an avatar // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); q = avatar.Rotation * q; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0); Vector3 toRegionPos; double dis; Action<ScenePresence> senseEntity = new Action<ScenePresence>(presence => { // m_log.DebugFormat( // "[SENSOR REPEAT]: Inspecting scene presence {0}, type {1} on sensor sweep for {2}, type {3}", // presence.Name, presence.PresenceType, ts.name, ts.type); if ((ts.type & NPC) == 0 && (ts.type & OS_NPC) == 0 && presence.PresenceType == PresenceType.Npc) { INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene); if (npcData == null || !npcData.SenseAsAgent) { // m_log.DebugFormat( // "[SENSOR REPEAT]: Discarding NPC {0} from agent sense sweep for script item id {1}", // presence.Name, ts.itemID); return; } } if ((ts.type & AGENT) == 0) { if (presence.PresenceType == PresenceType.User) { return; } else { INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene); if (npcData != null && npcData.SenseAsAgent) { // m_log.DebugFormat( // "[SENSOR REPEAT]: Discarding NPC {0} from non-agent sense sweep for script item id {1}", // presence.Name, ts.itemID); return; } } } if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) return; // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == SensePoint.OwnerID) return; toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // Disabled for now since all osNpc* methods check for appropriate ownership permission. // Perhaps could be re-enabled as an NPC setting at some point since being able to make NPCs not // sensed might be useful. // if (presence.PresenceType == PresenceType.Npc && npcModule != null) // { // UUID npcOwner = npcModule.GetOwner(presence.UUID); // if (npcOwner != UUID.Zero && npcOwner != SensePoint.OwnerID) // return; // } // are they in range if (dis <= ts.range) { // Are they in the required angle of view if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3( toRegionPos - fromRegionPos); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj <= ts.arc) { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } else { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } }); // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { ScenePresence sp; // Try direct lookup by UUID if (!m_CmdManager.m_ScriptEngine.World.TryGetScenePresence(ts.keyID, out sp)) return sensedEntities; senseEntity(sp); } else if (ts.name != null && ts.name != "") { ScenePresence sp; // Try lookup by name will return if/when found if (((ts.type & AGENT) != 0) && m_CmdManager.m_ScriptEngine.World.TryGetAvatarByName(ts.name, out sp)) senseEntity(sp); if ((ts.type & AGENT_BY_USERNAME) != 0) { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence( delegate (ScenePresence ssp) { if (ssp.Lastname == "Resident") { if (ssp.Firstname.ToLower() == ts.name) senseEntity(ssp); return; } if (ssp.Name.Replace(" ", ".").ToLower() == ts.name) senseEntity(ssp); } ); } return sensedEntities; } else { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence(senseEntity); } return sensedEntities; }
List<SensedEntity> doAgentSensor(SenseRepeatClass ts) { List<SensedEntity> sensedEntities = new List<SensedEntity>(); // If nobody about quit fast IEntityCountModule entityCountModule = ts.host.ParentEntity.Scene.RequestModuleInterface<IEntityCountModule>(); if (entityCountModule != null && entityCountModule.RootAgents == 0) return sensedEntities; ISceneChildEntity SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; Quaternion q = SensePoint.GetRotationOffset(); LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0)*r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); bool attached = (SensePoint.AttachmentPoint != 0); Vector3 toRegionPos; double dis; Action<IScenePresence> senseEntity = delegate(IScenePresence presence) { if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) return; // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == SensePoint.OwnerID) return; toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // are they in range if (dis <= ts.range) { // Are they in the required angle of view if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot/(mag_fwd*mag_obj)); } catch { } if (ang_obj <= ts.arc) { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } else { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } }; // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { IScenePresence sp; // Try direct lookup by UUID if (!ts.host.ParentEntity.Scene.TryGetScenePresence(ts.keyID, out sp)) return sensedEntities; senseEntity(sp); } else if (!string.IsNullOrEmpty(ts.name)) { IScenePresence sp; // Try lookup by name will return if/when found if (!ts.host.ParentEntity.Scene.TryGetAvatarByName(ts.name, out sp)) return sensedEntities; if (((ts.type & AGENT) != 0) && ts.host.ParentEntity.Scene.TryGetAvatarByName(ts.name, out sp)) senseEntity(sp); if ((ts.type & AGENT_BY_USERNAME) != 0) { ts.host.ParentEntity.Scene.ForEachScenePresence( delegate(IScenePresence ssp) { if (ssp.Name.Replace(" ", ".").ToLower() == ts.name) senseEntity(ssp); } ); } } else { ts.host.ParentEntity.Scene.ForEachScenePresence(senseEntity); } return sensedEntities; }
private List <SensedEntity> doAgentSensor(SenseRepeatClass ts) { List <SensedEntity> sensedEntities = new List <SensedEntity>(); // If nobody about quit fast if (m_CmdManager.m_ScriptEngine.World.GetRootAgentCount() == 0) { return(sensedEntities); } SceneObjectPart SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; Quaternion q = SensePoint.RotationOffset; if (SensePoint.ParentGroup.IsAttachment) { // In attachments, the sensor cone always orients with the // avatar rotation. This may include a nonzero elevation if // in mouselook. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); q = avatar.Rotation; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0); Vector3 toRegionPos; double dis; Action <ScenePresence> senseEntity = new Action <ScenePresence>(delegate(ScenePresence presence) { if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) { return; } // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == SensePoint.OwnerID) { return; } toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // are they in range if (dis <= ts.range) { // Are they in the required angle of view if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj <= ts.arc) { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } else { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } }); // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { ScenePresence sp; // Try direct lookup by UUID if (!m_CmdManager.m_ScriptEngine.World.TryGetScenePresence(ts.keyID, out sp)) { return(sensedEntities); } senseEntity(sp); } else if (ts.name != null && ts.name != "") { ScenePresence sp; // Try lookup by name will return if/when found if (((ts.type & AGENT) != 0) && m_CmdManager.m_ScriptEngine.World.TryGetAvatarByName(ts.name, out sp)) { senseEntity(sp); } if ((ts.type & AGENT_BY_USERNAME) != 0) { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence( delegate(ScenePresence ssp) { if (ssp.Lastname == "Resident") { if (ssp.Firstname.ToLower() == ts.name) { senseEntity(ssp); } return; } if (ssp.Name.Replace(" ", ".").ToLower() == ts.name) { senseEntity(ssp); } } ); } return(sensedEntities); } else { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence(senseEntity); } return(sensedEntities); }
private List <SensedEntity> doObjectSensor(SenseRepeatClass ts) { List <EntityBase> Entities; List <SensedEntity> sensedEntities = new List <SensedEntity>(); // If this is an object sense by key try to get it directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { EntityBase e = null; m_CmdManager.m_ScriptEngine.World.Entities.TryGetValue(ts.keyID, out e); if (e == null) { return(sensedEntities); } Entities = new List <EntityBase>(); Entities.Add(e); } else { Entities = new List <EntityBase>(m_CmdManager.m_ScriptEngine.World.GetEntities()); } SceneObjectPart SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.GetWorldPosition(); // pre define some things to avoid repeated definitions in the loop body Vector3 toRegionPos; double dis; int objtype; SceneObjectPart part; float dx; float dy; float dz; Quaternion q = SensePoint.GetWorldRotation(); if (SensePoint.ParentGroup.IsAttachment) { // In attachments, rotate the sensor cone with the // avatar rotation. This may include a nonzero elevation if // in mouselook. // This will not include the rotation and position of the // attachment point (e.g. your head when a sensor is in your // hair attached to your scull. Your hair will turn with // your head but the sensor will stay with your (global) // avatar rotation and position. // Position of a sensor in a child prim attached to an avatar // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); q = avatar.Rotation * q; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); Vector3 ZeroVector = new Vector3(0, 0, 0); bool nameSearch = (ts.name != null && ts.name != ""); foreach (EntityBase ent in Entities) { bool keep = true; if (nameSearch && ent.Name != ts.name) // Wrong name and it is a named search { continue; } if (ent.IsDeleted) // taken so long to do this it has gone from the scene { continue; } if (!(ent is SceneObjectGroup)) // dont bother if it is a pesky avatar { continue; } toRegionPos = ent.AbsolutePosition; // Calculation is in line for speed dx = toRegionPos.X - fromRegionPos.X; dy = toRegionPos.Y - fromRegionPos.Y; dz = toRegionPos.Z - fromRegionPos.Z; // Weed out those that will not fit in a cube the size of the range // no point calculating if they are within a sphere the size of the range // if they arent even in the cube if (Math.Abs(dx) > ts.range || Math.Abs(dy) > ts.range || Math.Abs(dz) > ts.range) { dis = ts.range + 1.0; } else { dis = Math.Sqrt(dx * dx + dy * dy + dz * dz); } if (keep && dis <= ts.range && ts.host.UUID != ent.UUID) { // In Range and not the object containing the script, is it the right Type ? objtype = 0; part = ((SceneObjectGroup)ent).RootPart; if (part.ParentGroup.AttachmentPoint != 0) // Attached so ignore { continue; } if (part.Inventory.ContainsScripts()) { objtype |= ACTIVE | SCRIPTED; // Scripted and active. It COULD have one hidden ... } else { if (ent.Velocity.Equals(ZeroVector)) { objtype |= PASSIVE; // Passive non-moving } else { objtype |= ACTIVE; // moving so active } } // If any of the objects attributes match any in the requested scan type if (((ts.type & objtype) != 0)) { // Right type too, what about the other params , key and name ? if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; double dot = LSL_Types.Vector3.Dot(forward_dir, diff); double mag_obj = LSL_Types.Vector3.Mag(diff); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj > ts.arc) { keep = false; } } if (keep == true) { // add distance for sorting purposes later sensedEntities.Add(new SensedEntity(dis, ent.UUID)); } } } } return(sensedEntities); }
private void SensorSweep(SenseRepeatClass ts) { if (ts.host == null) { return; } List<SensedEntity> sensedEntities = new List<SensedEntity>(); // Is the sensor type is AGENT and not SCRIPTED then include agents if ((ts.type & (AGENT | AGENT_BY_USERNAME)) != 0 && (ts.type & SCRIPTED) == 0) { sensedEntities.AddRange(doAgentSensor(ts)); } // If SCRIPTED or PASSIVE or ACTIVE check objects if ((ts.type & SCRIPTED) != 0 || (ts.type & PASSIVE) != 0 || (ts.type & ACTIVE) != 0) { sensedEntities.AddRange(doObjectSensor(ts)); } lock (SenseLock) { if (sensedEntities.Count == 0) { // send a "no_sensor" // Add it to queue m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("no_sensor", new Object[0], new DetectParams[0])); } else { // Sort the list to get everything ordered by distance sensedEntities.Sort(); int count = sensedEntities.Count; int idx; List<DetectParams> detected = new List<DetectParams>(); for (idx = 0; idx < count; idx++) { try { DetectParams detect = new DetectParams(); detect.Key = sensedEntities[idx].itemID; detect.Populate(m_CmdManager.m_ScriptEngine.World); detected.Add(detect); } catch (Exception) { // Ignore errors, the object has been deleted or the avatar has gone and // there was a problem in detect.Populate so nothing added to the list } if (detected.Count == maximumToReturn) break; } if (detected.Count == 0) { // To get here with zero in the list there must have been some sort of problem // like the object being deleted or the avatar leaving to have caused some // difficulty during the Populate above so fire a no_sensor event m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("no_sensor", new Object[0], new DetectParams[0])); } else { m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("sensor", new Object[] {new LSL_Types.LSLInteger(detected.Count) }, detected.ToArray())); } } } }
private List <SensedEntity> doAgentSensor(SenseRepeatClass ts) { List <ScenePresence> Presences; List <SensedEntity> sensedEntities = new List <SensedEntity>(); // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { ScenePresence p = m_CmdManager.m_ScriptEngine.World.GetScenePresence(ts.keyID); if (p == null) { return(sensedEntities); } Presences = new List <ScenePresence>(); Presences.Add(p); } else { Presences = m_CmdManager.m_ScriptEngine.World.GetScenePresences(); } // If nobody about quit fast if (Presences.Count == 0) { return(sensedEntities); } ISceneEntity SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; Quaternion r = GetWorldRotation(SensePoint); Vector3 forward_dir = new Vector3(1, 0, 0) * r; double mag_fwd = Vector3.Mag(forward_dir); bool attached = (GetAttachmentPoint(SensePoint) != 0); bool nameSearch = !String.IsNullOrEmpty(ts.name); Vector3 toRegionPos; double dis; foreach (ScenePresence presence in Presences) { bool keep = true; if (presence.IsDeleted || presence.IsInTransit) { continue; } if (presence.IsChildAgent) { keep = false; } toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // are they in range if (keep && dis <= ts.range) { // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == GetOwnerID(SensePoint)) { keep = false; } // check the name if needed if (keep && nameSearch && ts.name != presence.Name) { keep = false; } // Are they in the required angle of view if (keep && ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 obj_dir = toRegionPos - fromRegionPos; double dot = Vector3.Dot(forward_dir, obj_dir); double mag_obj = Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj > ts.arc) { keep = false; } } } else { keep = false; } // Do not report gods, not even minor ones if (keep && presence.GodLevel > 0.0) { keep = false; } if (keep) // add to list with distance { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } // If this is a search by name and we have just found it then no more to do if (nameSearch && ts.name == presence.Name) { return(sensedEntities); } } return(sensedEntities); }
private void SensorSweep(SenseRepeatClass ts) { if (ts.host == null) { return; } List <SensedEntity> sensedEntities = new List <SensedEntity>(); // Is the sensor type is AGENT and not SCRIPTED then include agents if ((ts.type & AGENT) != 0 && (ts.type & SCRIPTED) == 0) { sensedEntities.AddRange(doAgentSensor(ts)); } // If SCRIPTED or PASSIVE or ACTIVE check objects if ((ts.type & SCRIPTED) != 0 || (ts.type & PASSIVE) != 0 || (ts.type & ACTIVE) != 0) { sensedEntities.AddRange(doObjectSensor(ts)); } lock (SenseLock) { List <DetectParams> detected = new List <DetectParams>(); if (sensedEntities.Count == 0) { if (ts.host is ScenePresence) { //If it is a scenePresence, then it is a bot that is being used for scanning. // We need to set the bot parameter in the detectParams so that iwDetectedBot works properly // so we have to have at least one detectParam object DetectParams detect = new DetectParams(); detect.BotID = ((ScenePresence)ts.host).UUID; detected.Add(detect); } // send a "no_sensor" // Add it to queue m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("no_sensor", new Object[0], detected.ToArray())); } else { // Sort the list to get everything ordered by distance sensedEntities.Sort(); int count = sensedEntities.Count; int idx; for (idx = 0; idx < count; idx++) { try { DetectParams detect = new DetectParams(); detect.Key = sensedEntities[idx].itemID; if (ts.host is ScenePresence) { //If it is a scenePresence, then it is a bot that is being used for scanning. // We need to set the bot parameter in the detectParams so that iwDetectedBot works properly detect.BotID = ((ScenePresence)ts.host).UUID; if (detect.BotID == detect.Key) { continue;//Don't allow the ScenePresence that is scanning to detect itself } } detect.Populate(m_CmdManager.m_ScriptEngine.World); detected.Add(detect); } catch (Exception) { // Ignore errors, the object has been deleted or the avatar has gone and // there was a problem in detect.Populate so nothing added to the list } if (detected.Count == maximumToReturn) { break; } } if (detected.Count == 0) { if (ts.host is ScenePresence) { //If it is a scenePresence, then it is a bot that is being used for scanning. // We need to set the bot parameter in the detectParams so that iwDetectedBot works properly // so we have to have at least one detectParam object DetectParams detect = new DetectParams(); detect.BotID = ((ScenePresence)ts.host).UUID; detected.Add(detect); } // To get here with zero in the list there must have been some sort of problem // like the object being deleted or the avatar leaving to have caused some // difficulty during the Populate above so fire a no_sensor event m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("no_sensor", new Object[0], detected.ToArray())); } else { m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("sensor", new Object[] { detected.Count }, detected.ToArray())); } } } }
void SensorSweep(SenseRepeatClass ts) { if (ts.host == null) { return; } List<SensedEntity> sensedEntities = new List<SensedEntity>(); // Is the sensor type is AGENT and not SCRIPTED then include agents if ((ts.type & (AGENT | AGENT_BY_USERNAME)) != 0 && (ts.type & SCRIPTED) == 0) { sensedEntities.AddRange(doAgentSensor(ts)); } // If SCRIPTED or PASSIVE or ACTIVE check objects if ((ts.type & SCRIPTED) != 0 || (ts.type & PASSIVE) != 0 || (ts.type & ACTIVE) != 0) { sensedEntities.AddRange(doObjectSensor(ts)); } lock (SenseLock) { if (sensedEntities.Count == 0) { // send a "no_sensor" // Add it to queue m_ScriptEngine.PostScriptEvent(ts.itemID, ts.objectID, new EventParams("no_sensor", new object[0], new DetectParams[0]), EventPriority.Suspended); } else { // Sort the list to get everything ordered by distance sensedEntities.Sort(); int count = sensedEntities.Count; int idx; List<DetectParams> detected = new List<DetectParams>(); for (idx = 0; idx < count; idx++) { if (ts.host != null && ts.host.ParentEntity != null && ts.host.ParentEntity.Scene != null) { DetectParams detect = new DetectParams {Key = sensedEntities[idx].itemID}; detect.Populate(ts.host.ParentEntity.Scene); detected.Add(detect); if (detected.Count == maximumToReturn && usemaximumToReturn) break; } } if (detected.Count == 0) { // To get here with zero in the list there must have been some sort of problem // like the object being deleted or the avatar leaving to have caused some // difficulty during the Populate above so fire a no_sensor event m_ScriptEngine.PostScriptEvent(ts.itemID, ts.objectID, new EventParams("no_sensor", new object[0], new DetectParams[0]), EventPriority.Suspended); } else { m_ScriptEngine.PostScriptEvent(ts.itemID, ts.objectID, new EventParams("sensor", new object[] {new LSL_Types.LSLInteger(detected.Count)}, detected.ToArray()), EventPriority.Suspended); } } } }
public void CreateFromData(UUID itemID, UUID objectID, Object[] data) { SceneObjectPart part = findPrimsScene(objectID).GetSceneObjectPart( objectID); if (part == null) return; int idx = 0; while (idx < data.Length) { SenseRepeatClass ts = new SenseRepeatClass(); ts.objectID = objectID; ts.itemID = itemID; ts.interval = (long)Convert.ToDouble(data[idx]); ts.name = (string)data[idx+1]; ts.keyID = new UUID(data[idx+2].ToString()); ts.type = Convert.ToInt32(data[idx+3]); ts.range = Convert.ToDouble(data[idx+4]); ts.arc = Convert.ToDouble(data[idx + 5]); ts.host = part; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); SenseRepeaters.Add(ts); idx += 6; } }
List<SensedEntity> doObjectSensor(SenseRepeatClass ts) { List<ISceneEntity> Entities; List<SensedEntity> sensedEntities = new List<SensedEntity>(); ISceneChildEntity SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; // If this is an object sense by key try to get it directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { IEntity e = null; ts.host.ParentEntity.Scene.Entities.TryGetValue(ts.keyID, out e); if (e == null || !(e is ISceneEntity)) return sensedEntities; Entities = new List<ISceneEntity> {e as ISceneEntity}; } else { Entities = new List<ISceneEntity>(ts.host.ParentEntity.Scene.Entities.GetEntities(fromRegionPos, (float) ts.range)); } // pre define some things to avoid repeated definitions in the loop body Vector3 toRegionPos; double dis; int objtype; ISceneChildEntity part; float dx; float dy; float dz; Quaternion q = SensePoint.GetRotationOffset(); if (SensePoint.ParentEntity.RootChild.IsAttachment) { // In attachments, the sensor cone always orients with the // avatar rotation. This may include a nonzero elevation if // in mouselook. IScenePresence avatar = ts.host.ParentEntity.Scene.GetScenePresence(SensePoint.ParentEntity.RootChild.AttachedAvatar); q = avatar.Rotation; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0)*r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); Vector3 ZeroVector = new Vector3(0, 0, 0); bool nameSearch = !string.IsNullOrEmpty(ts.name); foreach (ISceneEntity ent in Entities) { bool keep = true; if (nameSearch && ent.Name != ts.name) // Wrong name and it is a named search continue; if (ent.IsDeleted) // taken so long to do this it has gone from the scene continue; if (!(ent is ISceneEntity)) // dont bother if it is a pesky avatar continue; toRegionPos = ent.AbsolutePosition; // Calculation is in line for speed dx = toRegionPos.X - fromRegionPos.X; dy = toRegionPos.Y - fromRegionPos.Y; dz = toRegionPos.Z - fromRegionPos.Z; // Weed out those that will not fit in a cube the size of the range // no point calculating if they are within a sphere the size of the range // if they arent even in the cube if (Math.Abs(dx) > ts.range || Math.Abs(dy) > ts.range || Math.Abs(dz) > ts.range) dis = ts.range + 1.0; else dis = Math.Sqrt(dx*dx + dy*dy + dz*dz); if (keep && dis <= ts.range && ts.host.UUID != ent.UUID) { // In Range and not the object containing the script, is it the right Type ? objtype = 0; part = (ent).RootChild; if (part.AttachmentPoint != 0) // Attached so ignore continue; if (part.Inventory.ContainsScripts()) { objtype |= ACTIVE | SCRIPTED; // Scripted and active. It COULD have one hidden ... } else { if (ent.Velocity.Equals(ZeroVector)) { objtype |= PASSIVE; // Passive non-moving } else { objtype |= ACTIVE; // moving so active } } // If any of the objects attributes match any in the requested scan type if (((ts.type & objtype) != 0)) { // Right type too, what about the other params , key and name ? if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot/(mag_fwd*mag_obj)); } catch { } if (ang_obj > ts.arc) keep = false; } if (keep) { // add distance for sorting purposes later sensedEntities.Add(new SensedEntity(dis, ent.UUID)); } } } } return sensedEntities; }
private List <SensedEntity> doObjectSensor(SenseRepeatClass ts) { List <ISceneEntity> Entities; List <SensedEntity> sensedEntities = new List <SensedEntity>(); ISceneChildEntity SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; // If this is an object sense by key try to get it directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { IEntity e = null; ts.host.ParentEntity.Scene.Entities.TryGetValue(ts.keyID, out e); if (e == null || !(e is ISceneEntity)) { return(sensedEntities); } Entities = new List <ISceneEntity> { e as ISceneEntity }; } else { Entities = new List <ISceneEntity>(ts.host.ParentEntity.Scene.Entities.GetEntities(fromRegionPos, (float)ts.range)); } // pre define some things to avoid repeated definitions in the loop body Vector3 toRegionPos; double dis; int objtype; ISceneChildEntity part; float dx; float dy; float dz; Quaternion q = SensePoint.GetRotationOffset(); if (SensePoint.ParentEntity.RootChild.IsAttachment) { // In attachments, the sensor cone always orients with the // avatar rotation. This may include a nonzero elevation if // in mouselook. IScenePresence avatar = ts.host.ParentEntity.Scene.GetScenePresence(SensePoint.ParentEntity.RootChild.AttachedAvatar); q = avatar.Rotation; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); Vector3 ZeroVector = new Vector3(0, 0, 0); bool nameSearch = !string.IsNullOrEmpty(ts.name); foreach (ISceneEntity ent in Entities) { bool keep = true; if (nameSearch && ent.Name != ts.name) // Wrong name and it is a named search { continue; } if (ent.IsDeleted) // taken so long to do this it has gone from the scene { continue; } if (!(ent is ISceneEntity)) // dont bother if it is a pesky avatar { continue; } toRegionPos = ent.AbsolutePosition; // Calculation is in line for speed dx = toRegionPos.X - fromRegionPos.X; dy = toRegionPos.Y - fromRegionPos.Y; dz = toRegionPos.Z - fromRegionPos.Z; // Weed out those that will not fit in a cube the size of the range // no point calculating if they are within a sphere the size of the range // if they arent even in the cube if (Math.Abs(dx) > ts.range || Math.Abs(dy) > ts.range || Math.Abs(dz) > ts.range) { dis = ts.range + 1.0; } else { dis = Math.Sqrt(dx * dx + dy * dy + dz * dz); } if (keep && dis <= ts.range && ts.host.UUID != ent.UUID) { // In Range and not the object containing the script, is it the right Type ? objtype = 0; part = (ent).RootChild; if (part.AttachmentPoint != 0) // Attached so ignore { continue; } if (part.Inventory.ContainsScripts()) { objtype |= ACTIVE | SCRIPTED; // Scripted and active. It COULD have one hidden ... } else { if (ent.Velocity.Equals(ZeroVector)) { objtype |= PASSIVE; // Passive non-moving } else { objtype |= ACTIVE; // moving so active } } // If any of the objects attributes match any in the requested scan type if (((ts.type & objtype) != 0)) { // Right type too, what about the other params , key and name ? if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj > ts.arc) { keep = false; } } if (keep) { // add distance for sorting purposes later sensedEntities.Add(new SensedEntity(dis, ent.UUID)); } } } } return(sensedEntities); }
private List<SensedEntity> doAgentSensor(SenseRepeatClass ts) { List<SensedEntity> sensedEntities = new List<SensedEntity>(); // If nobody about quit fast if (m_CmdManager.m_ScriptEngine.World.GetRootAgentCount() == 0) return sensedEntities; SceneObjectPart SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; Quaternion q = SensePoint.RotationOffset; if (SensePoint.ParentGroup.IsAttachment) { // In attachments, the sensor cone always orients with the // avatar rotation. This may include a nonzero elevation if // in mouselook. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); q = avatar.Rotation; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0); Vector3 toRegionPos; double dis; Action<ScenePresence> senseEntity = new Action<ScenePresence>(delegate(ScenePresence presence) { if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) return; // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == SensePoint.OwnerID) return; toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // are they in range if (dis <= ts.range) { // Are they in the required angle of view if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj <= ts.arc) { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } else { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } }); // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { ScenePresence sp; // Try direct lookup by UUID if (!m_CmdManager.m_ScriptEngine.World.TryGetScenePresence(ts.keyID, out sp)) return sensedEntities; senseEntity(sp); } else if (ts.name != null && ts.name != "") { ScenePresence sp; // Try lookup by name will return if/when found if (((ts.type & AGENT) != 0) && m_CmdManager.m_ScriptEngine.World.TryGetAvatarByName(ts.name, out sp)) senseEntity(sp); if ((ts.type & AGENT_BY_USERNAME) != 0) { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence( delegate (ScenePresence ssp) { if (ssp.Lastname == "Resident") { if (ssp.Firstname.ToLower() == ts.name) senseEntity(ssp); return; } if (ssp.Name.Replace(" ", ".").ToLower() == ts.name) senseEntity(ssp); } ); } return sensedEntities; } else { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence(senseEntity); } return sensedEntities; }
private void AddSenseRepeater(SenseRepeatClass senseRepeater) { lock (SenseRepeatListLock) { List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>(SenseRepeaters); newSenseRepeaters.Add(senseRepeater); SenseRepeaters = newSenseRepeaters; } }
private void SensorSweep(SenseRepeatClass ts) { if (ts.host == null) { return; } List <SensedEntity> sensedEntities = new List <SensedEntity>(); // Is the sensor type is AGENT and not SCRIPTED then include agents if ((ts.type & (AGENT | AGENT_BY_USERNAME | NPC | OS_NPC)) != 0 && (ts.type & SCRIPTED) == 0) { sensedEntities.AddRange(doAgentSensor(ts)); } // If SCRIPTED or PASSIVE or ACTIVE check objects if ((ts.type & SCRIPTED) != 0 || (ts.type & PASSIVE) != 0 || (ts.type & ACTIVE) != 0) { sensedEntities.AddRange(doObjectSensor(ts)); } lock (SenseLock) { if (sensedEntities.Count == 0) { // send a "no_sensor" // Add it to queue m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("no_sensor", new Object[0], new DetectParams[0])); } else { // Sort the list to get everything ordered by distance sensedEntities.Sort(); int count = sensedEntities.Count; int idx; List <DetectParams> detected = new List <DetectParams>(); for (idx = 0; idx < count; idx++) { try { DetectParams detect = new DetectParams(); detect.Key = sensedEntities[idx].itemID; detect.Populate(m_CmdManager.m_ScriptEngine.World); detected.Add(detect); } catch (Exception) { // Ignore errors, the object has been deleted or the avatar has gone and // there was a problem in detect.Populate so nothing added to the list } if (detected.Count == maximumToReturn) { break; } } if (detected.Count == 0) { // To get here with zero in the list there must have been some sort of problem // like the object being deleted or the avatar leaving to have caused some // difficulty during the Populate above so fire a no_sensor event m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("no_sensor", new Object[0], new DetectParams[0])); } else { m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("sensor", new Object[] { new LSL_Types.LSLInteger(detected.Count) }, detected.ToArray())); } } } }
public void SetSenseRepeatEvent(uint m_localID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, double sec, ISceneEntity host) { // Always remove first, in case this is a re-set UnSetSenseRepeaterEvents(m_localID, m_itemID); if (sec == 0) // Disabling timer return; // Add to timer SenseRepeatClass ts = new SenseRepeatClass(); ts.localID = m_localID; ts.itemID = m_itemID; ts.interval = sec; ts.name = name; ts.keyID = keyID; ts.type = type; if (range > maximumRange) ts.range = maximumRange; else ts.range = range; ts.arc = arc; ts.host = host; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); lock (SenseRepeatListLock) { SenseRepeaters.Add(ts); } }
private List <SensedEntity> doAgentSensor(SenseRepeatClass ts) { List <SensedEntity> sensedEntities = new List <SensedEntity>(); // If nobody about quit fast if (m_CmdManager.m_ScriptEngine.World.GetRootAgentCount() == 0) { return(sensedEntities); } SceneObjectPart SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.GetWorldPosition(); Quaternion q = SensePoint.GetWorldRotation(); if (SensePoint.ParentGroup.IsAttachment) { // In attachments, rotate the sensor cone with the // avatar rotation. This may include a nonzero elevation if // in mouselook. // This will not include the rotation and position of the // attachment point (e.g. your head when a sensor is in your // hair attached to your scull. Your hair will turn with // your head but the sensor will stay with your (global) // avatar rotation and position. // Position of a sensor in a child prim attached to an avatar // will be still wrong. ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.AttachedAvatar); q = avatar.Rotation * q; } LSL_Types.Quaternion r = new LSL_Types.Quaternion(q); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); bool attached = (SensePoint.ParentGroup.AttachmentPoint != 0); Vector3 toRegionPos; double dis; Action <ScenePresence> senseEntity = new Action <ScenePresence>(presence => { // m_log.DebugFormat( // "[SENSOR REPEAT]: Inspecting scene presence {0}, type {1} on sensor sweep for {2}, type {3}", // presence.Name, presence.PresenceType, ts.name, ts.type); if ((ts.type & NPC) == 0 && (ts.type & OS_NPC) == 0 && presence.PresenceType == PresenceType.Npc) { INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene); if (npcData == null || !npcData.SenseAsAgent) { // m_log.DebugFormat( // "[SENSOR REPEAT]: Discarding NPC {0} from agent sense sweep for script item id {1}", // presence.Name, ts.itemID); return; } } if ((ts.type & AGENT) == 0) { if (presence.PresenceType == PresenceType.User) { return; } else { INPC npcData = m_npcModule.GetNPC(presence.UUID, presence.Scene); if (npcData != null && npcData.SenseAsAgent) { // m_log.DebugFormat( // "[SENSOR REPEAT]: Discarding NPC {0} from non-agent sense sweep for script item id {1}", // presence.Name, ts.itemID); return; } } } if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) { return; } // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == SensePoint.OwnerID) { return; } toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // Disabled for now since all osNpc* methods check for appropriate ownership permission. // Perhaps could be re-enabled as an NPC setting at some point since being able to make NPCs not // sensed might be useful. // if (presence.PresenceType == PresenceType.Npc && npcModule != null) // { // UUID npcOwner = npcModule.GetOwner(presence.UUID); // if (npcOwner != UUID.Zero && npcOwner != SensePoint.OwnerID) // return; // } // are they in range if (dis <= ts.range) { // Are they in the required angle of view if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3( toRegionPos - fromRegionPos); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj <= ts.arc) { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } else { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } }); // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { ScenePresence sp; // Try direct lookup by UUID if (!m_CmdManager.m_ScriptEngine.World.TryGetScenePresence(ts.keyID, out sp)) { return(sensedEntities); } senseEntity(sp); } else if (ts.name != null && ts.name != "") { ScenePresence sp; // Try lookup by name will return if/when found if (((ts.type & AGENT) != 0) && m_CmdManager.m_ScriptEngine.World.TryGetAvatarByName(ts.name, out sp)) { senseEntity(sp); } if ((ts.type & AGENT_BY_USERNAME) != 0) { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence( delegate(ScenePresence ssp) { if (ssp.Lastname == "Resident") { if (ssp.Firstname.ToLower() == ts.name) { senseEntity(ssp); } return; } if (ssp.Name.Replace(" ", ".").ToLower() == ts.name) { senseEntity(ssp); } } ); } return(sensedEntities); } else { m_CmdManager.m_ScriptEngine.World.ForEachRootScenePresence(senseEntity); } return(sensedEntities); }
public void SenseOnce(uint m_localID, UUID m_itemID, string name, UUID keyID, int type, double range, double arc, ISceneEntity host) { // Add to timer SenseRepeatClass ts = new SenseRepeatClass(); ts.localID = m_localID; ts.itemID = m_itemID; ts.interval = 0; ts.name = name; ts.keyID = keyID; ts.type = type; if (range > maximumRange) ts.range = maximumRange; else ts.range = range; ts.arc = arc; ts.host = host; SensorSweep(ts); }
private void SensorSweep(SenseRepeatClass ts) { if (ts.host == null) { return; } List<SensedEntity> sensedEntities = new List<SensedEntity>(); // Is the sensor type is AGENT and not SCRIPTED then include agents if ((ts.type & AGENT) != 0 && (ts.type & SCRIPTED) == 0) { sensedEntities.AddRange(doAgentSensor(ts)); } // If SCRIPTED or PASSIVE or ACTIVE check objects if ((ts.type & SCRIPTED) != 0 || (ts.type & PASSIVE) != 0 || (ts.type & ACTIVE) != 0) { sensedEntities.AddRange(doObjectSensor(ts)); } lock (SenseLock) { List<DetectParams> detected = new List<DetectParams>(); if (sensedEntities.Count == 0) { if (ts.host is ScenePresence) { //If it is a scenePresence, then it is a bot that is being used for scanning. // We need to set the bot parameter in the detectParams so that iwDetectedBot works properly // so we have to have at least one detectParam object DetectParams detect = new DetectParams(); detect.BotID = ((ScenePresence)ts.host).UUID; detected.Add(detect); } // send a "no_sensor" // Add it to queue m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("no_sensor", new Object[0], detected.ToArray())); } else { // Sort the list to get everything ordered by distance sensedEntities.Sort(); int count = sensedEntities.Count; int idx; for (idx = 0; idx < count; idx++) { try { DetectParams detect = new DetectParams(); detect.Key = sensedEntities[idx].itemID; if (ts.host is ScenePresence) { //If it is a scenePresence, then it is a bot that is being used for scanning. // We need to set the bot parameter in the detectParams so that iwDetectedBot works properly detect.BotID = ((ScenePresence)ts.host).UUID; if (detect.BotID == detect.Key) continue;//Don't allow the ScenePresence that is scanning to detect itself } detect.Populate(m_CmdManager.m_ScriptEngine.World); detected.Add(detect); } catch (Exception) { // Ignore errors, the object has been deleted or the avatar has gone and // there was a problem in detect.Populate so nothing added to the list } if (detected.Count == maximumToReturn) break; } if (detected.Count == 0) { if (ts.host is ScenePresence) { //If it is a scenePresence, then it is a bot that is being used for scanning. // We need to set the bot parameter in the detectParams so that iwDetectedBot works properly // so we have to have at least one detectParam object DetectParams detect = new DetectParams(); detect.BotID = ((ScenePresence)ts.host).UUID; detected.Add(detect); } // To get here with zero in the list there must have been some sort of problem // like the object being deleted or the avatar leaving to have caused some // difficulty during the Populate above so fire a no_sensor event m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("no_sensor", new Object[0], detected.ToArray())); } else { m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, new EventParams("sensor", new Object[] {detected.Count}, detected.ToArray())); } } } }
private List<SensedEntity> doObjectSensor(SenseRepeatClass ts) { List<EntityBase> Entities; List<SensedEntity> sensedEntities = new List<SensedEntity>(); // If this is an object sense by key try to get it directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { EntityBase e = null; m_CmdManager.m_ScriptEngine.World.Entities.TryGetValue(ts.keyID, out e); if (e == null) return sensedEntities; Entities = new List<EntityBase>(); Entities.Add(e); } else { Entities = m_CmdManager.m_ScriptEngine.World.GetEntities(); } ISceneEntity SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; // pre define some things to avoid repeated definitions in the loop body Vector3 toRegionPos; double dis; int objtype; SceneObjectPart part; float dx; float dy; float dz; Quaternion r = GetWorldRotation(SensePoint); Vector3 forward_dir = new Vector3(1, 0, 0) * r; double mag_fwd = Vector3.Mag(forward_dir); Vector3 ZeroVector = new Vector3(0, 0, 0); bool nameSearch = (ts.name != null && ts.name != ""); foreach (EntityBase ent in Entities) { bool keep = true; if (nameSearch && ent.Name != ts.name) // Wrong name and it is a named search continue; if (ent.IsDeleted) // taken so long to do this it has gone from the scene continue; if (!(ent is SceneObjectGroup)) // dont bother if it is a pesky avatar continue; if (((SceneObjectGroup)ent).InTransit) continue; toRegionPos = ent.AbsolutePosition; // Calculation is in line for speed dx = toRegionPos.X - fromRegionPos.X; dy = toRegionPos.Y - fromRegionPos.Y; dz = toRegionPos.Z - fromRegionPos.Z; // Weed out those that will not fit in a cube the size of the range // no point calculating if they are within a sphere the size of the range // if they arent even in the cube if (Math.Abs(dx) > ts.range || Math.Abs(dy) > ts.range || Math.Abs(dz) > ts.range) dis = ts.range + 1.0; else dis = Math.Sqrt(dx * dx + dy * dy + dz * dz); if (keep && dis <= ts.range && ts.host.UUID != ent.UUID) { // In Range and not the object containing the script, is it the right Type ? objtype = 0; part = ((SceneObjectGroup)ent).RootPart; if (part.AttachmentPoint != 0) // Attached so ignore continue; if (part.Inventory.ContainsScripts()) { objtype |= ACTIVE | SCRIPTED; // Scripted and active. It COULD have one hidden ... } else { if (part.Velocity.Equals(ZeroVector)) { objtype |= PASSIVE; // Passive non-moving } else { objtype |= ACTIVE; // moving so active } } // If any of the objects attributes match any in the requested scan type if (((ts.type & objtype) != 0)) { // Right type too, what about the other params , key and name ? if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; Vector3 obj_dir = new Vector3(diff.X, diff.Y, diff.Z); double dot = Vector3.Dot(forward_dir, obj_dir); double mag_obj = Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj > ts.arc) keep = false; } if (keep == true) { // add distance for sorting purposes later sensedEntities.Add(new SensedEntity(dis, ent.UUID)); } } } } return sensedEntities; }
private void SensorSweep(SenseRepeatClass ts) { if (ts.host == null) { return; } List <SensedEntity> sensedEntities = new List <SensedEntity>(); // Is the sensor type is AGENT and not SCRIPTED then include agents if ((ts.type & (AGENT | AGENT_BY_USERNAME)) != 0 && (ts.type & SCRIPTED) == 0) { sensedEntities.AddRange(doAgentSensor(ts)); } // If SCRIPTED or PASSIVE or ACTIVE check objects if ((ts.type & SCRIPTED) != 0 || (ts.type & PASSIVE) != 0 || (ts.type & ACTIVE) != 0) { sensedEntities.AddRange(doObjectSensor(ts)); } lock (SenseLock) { if (sensedEntities.Count == 0) { // send a "no_sensor" // Add it to queue m_ScriptEngine.PostScriptEvent(ts.itemID, ts.objectID, new EventParams("no_sensor", new Object[0], new DetectParams[0]), EventPriority.Suspended); } else { // Sort the list to get everything ordered by distance sensedEntities.Sort(); int count = sensedEntities.Count; int idx; List <DetectParams> detected = new List <DetectParams>(); for (idx = 0; idx < count; idx++) { if (ts.host != null && ts.host.ParentEntity != null && ts.host.ParentEntity.Scene != null) { DetectParams detect = new DetectParams { Key = sensedEntities[idx].itemID }; detect.Populate(ts.host.ParentEntity.Scene); detected.Add(detect); if (detected.Count == maximumToReturn && usemaximumToReturn) { break; } } } if (detected.Count == 0) { // To get here with zero in the list there must have been some sort of problem // like the object being deleted or the avatar leaving to have caused some // difficulty during the Populate above so fire a no_sensor event m_ScriptEngine.PostScriptEvent(ts.itemID, ts.objectID, new EventParams("no_sensor", new Object[0], new DetectParams[0]), EventPriority.Suspended); } else { m_ScriptEngine.PostScriptEvent(ts.itemID, ts.objectID, new EventParams("sensor", new Object[] { new LSL_Types.LSLInteger(detected.Count) }, detected.ToArray()), EventPriority.Suspended); } } } }
private List<SensedEntity> doAgentSensor(SenseRepeatClass ts) { List<ScenePresence> Presences; List<SensedEntity> sensedEntities = new List<SensedEntity>(); // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { ScenePresence p = m_CmdManager.m_ScriptEngine.World.GetScenePresence(ts.keyID); if (p == null) return sensedEntities; Presences = new List<ScenePresence>(); Presences.Add(p); } else { Presences = m_CmdManager.m_ScriptEngine.World.GetScenePresences(); } // If nobody about quit fast if (Presences.Count == 0) return sensedEntities; ISceneEntity SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; Quaternion r = GetWorldRotation(SensePoint); Vector3 forward_dir = new Vector3(1, 0, 0) * r; double mag_fwd = Vector3.Mag(forward_dir); bool attached = (GetAttachmentPoint(SensePoint) != 0); bool nameSearch = (ts.name != null && ts.name != ""); Vector3 toRegionPos; double dis; foreach (ScenePresence presence in Presences) { bool keep = true; if (presence.IsDeleted || presence.IsInTransit) continue; if (presence.IsChildAgent) keep = false; toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // are they in range if (keep && dis <= ts.range) { // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == GetOwnerID(SensePoint)) keep = false; // check the name if needed if (keep && nameSearch && ts.name != presence.Name) keep = false; // Are they in the required angle of view if (keep && ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 obj_dir = toRegionPos - fromRegionPos; double dot = Vector3.Dot(forward_dir, obj_dir); double mag_obj = Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj > ts.arc) keep = false; } } else { keep = false; } // Do not report gods, not even minor ones if (keep && presence.GodLevel > 0.0) keep = false; if (keep) // add to list with distance { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } // If this is a search by name and we have just found it then no more to do if (nameSearch && ts.name == presence.Name) return sensedEntities; } return sensedEntities; }
private List <SensedEntity> doAgentSensor(SenseRepeatClass ts) { List <SensedEntity> sensedEntities = new List <SensedEntity>(); // If nobody about quit fast IEntityCountModule entityCountModule = ts.host.ParentEntity.Scene.RequestModuleInterface <IEntityCountModule>(); if (entityCountModule != null && entityCountModule.RootAgents == 0) { return(sensedEntities); } ISceneChildEntity SensePoint = ts.host; Vector3 fromRegionPos = SensePoint.AbsolutePosition; Quaternion q = SensePoint.GetRotationOffset(); LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); bool attached = (SensePoint.AttachmentPoint != 0); Vector3 toRegionPos; double dis; Action <IScenePresence> senseEntity = delegate(IScenePresence presence) { if (presence.IsDeleted || presence.IsChildAgent || presence.GodLevel > 0.0) { return; } // if the object the script is in is attached and the avatar is the owner // then this one is not wanted if (attached && presence.UUID == SensePoint.OwnerID) { return; } toRegionPos = presence.AbsolutePosition; dis = Math.Abs(Util.GetDistanceTo(toRegionPos, fromRegionPos)); // are they in range if (dis <= ts.range) { // Are they in the required angle of view if (ts.arc < Math.PI) { // not omni-directional. Can you see it ? // vec forward_dir = llRot2Fwd(llGetRot()) // vec obj_dir = toRegionPos-fromRegionPos // dot=dot(forward_dir,obj_dir) // mag_fwd = mag(forward_dir) // mag_obj = mag(obj_dir) // ang = acos(dot /(mag_fwd*mag_obj)) double ang_obj = 0; try { Vector3 diff = toRegionPos - fromRegionPos; LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); double mag_obj = LSL_Types.Vector3.Mag(obj_dir); ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); } catch { } if (ang_obj <= ts.arc) { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } else { sensedEntities.Add(new SensedEntity(dis, presence.UUID)); } } }; // If this is an avatar sense by key try to get them directly // rather than getting a list to scan through if (ts.keyID != UUID.Zero) { IScenePresence sp; // Try direct lookup by UUID if (!ts.host.ParentEntity.Scene.TryGetScenePresence(ts.keyID, out sp)) { return(sensedEntities); } senseEntity(sp); } else if (!string.IsNullOrEmpty(ts.name)) { IScenePresence sp; // Try lookup by name will return if/when found if (!ts.host.ParentEntity.Scene.TryGetAvatarByName(ts.name, out sp)) { return(sensedEntities); } if (((ts.type & AGENT) != 0) && ts.host.ParentEntity.Scene.TryGetAvatarByName(ts.name, out sp)) { senseEntity(sp); } if ((ts.type & AGENT_BY_USERNAME) != 0) { ts.host.ParentEntity.Scene.ForEachScenePresence( delegate(IScenePresence ssp) { if (ssp.Name.Replace(" ", ".").ToLower() == ts.name) { senseEntity(ssp); } } ); } } else { ts.host.ParentEntity.Scene.ForEachScenePresence(senseEntity); } return(sensedEntities); }
public void CreateFromData(UUID itemID, UUID objectID, OSD data) { ISceneChildEntity part = findPrimsScene(objectID).GetSceneObjectPart( objectID); if (part == null) return; OSDMap save = (OSDMap)data; foreach(KeyValuePair<string, OSD> kvp in save) { OSDMap map = (OSDMap)kvp.Value; SenseRepeatClass ts = new SenseRepeatClass (); ts.objectID = objectID; ts.itemID = itemID; ts.interval = (long)map["Interval"].AsInteger(); ts.name = map["Name"].AsString(); ts.keyID = map["ID"].AsUUID(); ts.type = map["Type"].AsInteger(); ts.range = map["Range"].AsReal(); ts.arc = map["Arc"].AsReal (); ts.host = part; ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); SenseRepeaters.Add(ts); } }