Пример #1
0
        /// <summary>
        /// Sends a request to the simulator to return a list of objects owned by specific owners
        /// </summary>
        /// <param name="localID">Simulator local ID of parcel</param>
        /// <param name="selectType">Owners, Others, Etc</param>
        /// <param name="ownerID">List containing keys of avatars objects to select; 
        /// if List is null will return Objects of type <c>selectType</c></param>
        /// <remarks>Response data is returned in the event <seealso cref="E:OnParcelSelectedObjects"/></remarks>
        public void RequestSelectObjects(int localID, ObjectReturnType selectType, UUID ownerID)
        {
            ParcelSelectObjectsPacket select = new ParcelSelectObjectsPacket();
            select.AgentData.AgentID = Client.Self.AgentID;
            select.AgentData.SessionID = Client.Self.SessionID;

            select.ParcelData.LocalID = localID;
            select.ParcelData.ReturnType = (uint)selectType;

            select.ReturnIDs = new ParcelSelectObjectsPacket.ReturnIDsBlock[1];
            select.ReturnIDs[0] = new ParcelSelectObjectsPacket.ReturnIDsBlock();
            select.ReturnIDs[0].ReturnID = ownerID;

            Client.Network.SendPacket(select);
        }
Пример #2
0
        /// <summary>
        /// Return objects from a parcel
        /// </summary>
        /// <param name="simulator">Simulator parcel is in</param>
        /// <param name="localID">The parcels region specific local ID</param>
        /// <param name="type">the type of objects to return, <seealso cref="T:OpenMetaverse.ObjectReturnType"/></param>
        /// <param name="ownerIDs">A list containing object owners <seealso cref="OpenMetaverse.UUID"/>s to return</param>
        public void ReturnObjects(Simulator simulator, int localID, ObjectReturnType type, List<UUID> ownerIDs)
        {
            ParcelReturnObjectsPacket request = new ParcelReturnObjectsPacket();
            request.AgentData.AgentID = Client.Self.AgentID;
            request.AgentData.SessionID = Client.Self.SessionID;

            request.ParcelData.LocalID = localID;
            request.ParcelData.ReturnType = (uint)type;

            // A single null TaskID is (not) used for parcel object returns
            request.TaskIDs = new ParcelReturnObjectsPacket.TaskIDsBlock[1];
            request.TaskIDs[0] = new ParcelReturnObjectsPacket.TaskIDsBlock();
            request.TaskIDs[0].TaskID = UUID.Zero;

            // Convert the list of owner UUIDs to packet blocks if a list is given
            if (ownerIDs != null)
            {
                request.OwnerIDs = new ParcelReturnObjectsPacket.OwnerIDsBlock[ownerIDs.Count];

                for (int i = 0; i < ownerIDs.Count; i++)
                {
                    request.OwnerIDs[i] = new ParcelReturnObjectsPacket.OwnerIDsBlock();
                    request.OwnerIDs[i].OwnerID = ownerIDs[i];
                }
            }
            else
            {
                request.OwnerIDs = new ParcelReturnObjectsPacket.OwnerIDsBlock[0];
            }

            Client.Network.SendPacket(request, simulator);
        }
Пример #3
0
        private void ParcelSelectObjectsHandler(Packet packet, LLAgent agent)
        {
            ParcelSelectObjectsPacket select = (ParcelSelectObjectsPacket)packet;

            SceneParcel parcel;

            if (m_parcels.TryGetParcel(select.ParcelData.LocalID, out parcel))
            {
                ObjectReturnType type = (ObjectReturnType)select.ParcelData.ReturnType;

                Predicate <ISceneEntity> selectFilter;

                switch (type)
                {
                case ObjectReturnType.Owner:
                    selectFilter = delegate(ISceneEntity e)
                    {
                        if (e is ILinkable && ((ILinkable)e).Parent != null)
                        {
                            return(false);
                        }
                        return(e.OwnerID == parcel.OwnerID);
                    };
                    break;

                case ObjectReturnType.Group:
                    // FIXME: Need to track group deeding to implement this
                    selectFilter = delegate(ISceneEntity e)
                    {
                        if (e is ILinkable && ((ILinkable)e).Parent != null)
                        {
                            return(false);
                        }
                        return(e.GroupID == parcel.GroupID);
                    };
                    break;

                case ObjectReturnType.Other:
                    // FIXME: Need to track group deeding to implement this
                    selectFilter = delegate(ISceneEntity e)
                    {
                        if (e is ILinkable && ((ILinkable)e).Parent != null)
                        {
                            return(false);
                        }
                        return(e.OwnerID != parcel.OwnerID);
                    };
                    break;

                case ObjectReturnType.Sell:
                    selectFilter = delegate(ISceneEntity e)
                    {
                        if (e is ILinkable && ((ILinkable)e).Parent != null)
                        {
                            return(false);
                        }
                        return(e is LLPrimitive && ((LLPrimitive)e).Prim.Properties.SaleType != SaleType.Not);
                    };
                    break;

                case ObjectReturnType.List:
                    HashSet <UUID> selectIDs = new HashSet <UUID>();
                    for (int i = 0; i < select.ReturnIDs.Length; i++)
                    {
                        selectIDs.Add(select.ReturnIDs[i].ReturnID);
                    }
                    selectFilter = delegate(ISceneEntity e)
                    {
                        return(selectIDs.Contains(e.ID));
                    };
                    break;

                case ObjectReturnType.None:
                default:
                    m_log.Warn(agent.Name + " sent an unrecognized select objects command " + type);
                    return;
                }

                // FIXME: What packet do we return?
            }
            else
            {
                m_log.Warn(agent.Name + " tried to select objects on unknown parcel " + select.ParcelData.LocalID);
            }
        }
Пример #4
0
        /// <summary>
        /// Sends a request to the simulator to return a list of objects owned by specific owners
        /// </summary>
        /// <param name="localID">Simulator local ID of parcel</param>
        /// <param name="selectType">Owners, Others, Etc</param>
        /// <param name="ownerID">List containing keys of avatars objects to select; 
        /// if List is null will return Objects of type <c>selectType</c></param>
        /// <remarks>Response data is returned in the event <seealso cref="E:OnParcelSelectedObjects"/></remarks>
        public void SelectObjects(int localID, ObjectReturnType selectType, UUID ownerID)
        {
            if (OnParcelSelectedObjects != null)
            {
                ParcelSelectObjectsPacket select = new ParcelSelectObjectsPacket();
                select.AgentData.AgentID = Network.AgentID;
                select.AgentData.SessionID = Network.SessionID;

                select.ParcelData.LocalID = localID;
                select.ParcelData.ReturnType = (uint)selectType;

                select.ReturnIDs = new ParcelSelectObjectsPacket.ReturnIDsBlock[1];
                select.ReturnIDs[0] = new ParcelSelectObjectsPacket.ReturnIDsBlock();
                select.ReturnIDs[0].ReturnID = ownerID;
                Network.SendPacket(select);
            }
        }
Пример #5
0
        /// <summary>
        /// Sends a request to the simulator to return a list of objects owned by specific owners
        /// </summary>
        /// <param name="localID">Simulator local ID of parcel</param>
        /// <param name="selectType">Owners, Others, Etc</param>
        /// <param name="ownerIDs">List containing keys of avatars objects to select; 
        /// if List is null will return Objects of type <c>selectType</c></param>
        /// <remarks>Response data is returned in the event <seealso cref="E:OnParcelSelectedObjects"/></remarks>
        public void SelectObjects(int localID, ObjectReturnType selectType, List<LLUUID> ownerIDs)
        {
            if (OnParcelSelectedObjects != null)
            {
                ParcelSelectObjectsPacket select = new ParcelSelectObjectsPacket();
                select.AgentData.AgentID = Client.Self.AgentID;
                select.AgentData.SessionID = Client.Self.SessionID;

                select.ParcelData.LocalID = localID;
                select.ParcelData.ReturnType = (uint)selectType;

                if (ownerIDs != null)
                {
                    select.ReturnIDs = new ParcelSelectObjectsPacket.ReturnIDsBlock[ownerIDs.Count];

                    for (int i = 0; i < ownerIDs.Count; i++)
                    {
                        select.ReturnIDs[i] = new ParcelSelectObjectsPacket.ReturnIDsBlock();
                        select.ReturnIDs[i].ReturnID = ownerIDs[i];
                    }
                }
                else
                {
                    select.ReturnIDs = new ParcelSelectObjectsPacket.ReturnIDsBlock[0];
                }
                Client.Network.SendPacket(select);
            }
        }
Пример #6
0
 internal HashTableEnumerator(HashTable hashtable, ObjectReturnType returnType)
 {
     _hashtable        = hashtable;
     _index            = hashtable.Data?.Length ?? -1;
     _objectReturnType = returnType;
 }