Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
 private void AddSenseRepeater(SenseRepeatClass senseRepeater)
 {
     lock (SenseRepeatListLock)
     {
         List <SenseRepeatClass> newSenseRepeaters = new List <SenseRepeatClass>(SenseRepeaters);
         newSenseRepeaters.Add(senseRepeater);
         SenseRepeaters = newSenseRepeaters;
     }
 }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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;
            }
        }
Exemplo n.º 9
0
        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);
            }
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
        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);
        }
Exemplo n.º 12
0
        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);
        }
Exemplo n.º 13
0
        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;
            }
        }
Exemplo n.º 14
0
 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);
 }
Exemplo n.º 15
0
        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;
        }
Exemplo n.º 16
0
        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;
        }
Exemplo n.º 17
0
        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);
        }
Exemplo n.º 18
0
        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);
        }
Exemplo n.º 19
0
        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()));
                    }
                }
            }
        }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
0
        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()));
                    }
                }
            }
        }
Exemplo n.º 22
0
        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);
                    }
                }
            }
        }
Exemplo n.º 23
0
        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;
            }
        }
Exemplo n.º 24
0
        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;
        }
Exemplo n.º 25
0
        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);
        }
Exemplo n.º 26
0
        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;
        }
Exemplo n.º 27
0
 private void AddSenseRepeater(SenseRepeatClass senseRepeater)
 {
     lock (SenseRepeatListLock)
     {
         List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>(SenseRepeaters);
         newSenseRepeaters.Add(senseRepeater);
         SenseRepeaters = newSenseRepeaters;
     }
 }
Exemplo n.º 28
0
        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()));
                    }
                }
            }
        }
Exemplo n.º 29
0
        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);
            }
        }
Exemplo n.º 30
0
        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);
        }
Exemplo n.º 31
0
 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);
 }
Exemplo n.º 32
0
        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()));
                    }
                }
            }
        }
Exemplo n.º 33
0
        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;
        }
Exemplo n.º 34
0
        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);
                    }
                }
            }
        }
Exemplo n.º 35
0
        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;
        }
Exemplo n.º 36
0
        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);
        }
Exemplo n.º 37
0
        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);
            }
        }