Example #1
0
        void DeRezObjectHandler(Packet packet, Agent agent)
        {
            DeRezObjectPacket derez       = (DeRezObjectPacket)packet;
            DeRezDestination  destination = (DeRezDestination)derez.AgentBlock.Destination;

            // TODO: Check permissions

            for (int i = 0; i < derez.ObjectData.Length; i++)
            {
                uint localID = derez.ObjectData[i].ObjectLocalID;

                SimulationObject obj;
                if (server.Scene.TryGetObject(localID, out obj))
                {
                    switch (destination)
                    {
                    case DeRezDestination.AgentInventorySave:
                        Logger.Log("DeRezObject: Got an AgentInventorySave, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.AgentInventoryCopy:
                        Logger.Log("DeRezObject: Got an AgentInventorySave, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.TaskInventory:
                        Logger.Log("DeRezObject: Got a TaskInventory, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.Attachment:
                        Logger.Log("DeRezObject: Got an Attachment, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.AgentInventoryTake:
                        Logger.Log("DeRezObject: Got an AgentInventoryTake, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.ForceToGodInventory:
                        Logger.Log("DeRezObject: Got a ForceToGodInventory, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.TrashFolder:
                        InventoryObject invObj;
                        if (server.Inventory.TryGetInventory(agent.AgentID, derez.AgentBlock.DestinationID, out invObj) &&
                            invObj is InventoryFolder)
                        {
                            // FIXME: Handle children
                            InventoryFolder trash = (InventoryFolder)invObj;
                            server.Inventory.CreateItem(agent.AgentID, obj.Prim.Properties.Name, obj.Prim.Properties.Description, InventoryType.Object,
                                                        AssetType.Object, obj.Prim.ID, trash.ID, PermissionMask.All, PermissionMask.All, agent.AgentID,
                                                        obj.Prim.Properties.CreatorID, derez.AgentBlock.TransactionID, 0, true);
                            server.Scene.ObjectRemove(this, obj);

                            Logger.DebugLog(String.Format("Derezzed prim {0} to agent inventory trash", obj.Prim.LocalID));
                        }
                        else
                        {
                            Logger.Log("DeRezObject: Got a TrashFolder with an invalid trash folder: " +
                                       derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        }
                        break;

                    case DeRezDestination.AttachmentToInventory:
                        Logger.Log("DeRezObject: Got an AttachmentToInventory, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.AttachmentExists:
                        Logger.Log("DeRezObject: Got an AttachmentExists, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.ReturnToOwner:
                        Logger.Log("DeRezObject: Got a ReturnToOwner, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;

                    case DeRezDestination.ReturnToLastOwner:
                        Logger.Log("DeRezObject: Got a ReturnToLastOwner, DestID: " +
                                   derez.AgentBlock.DestinationID.ToString(), Helpers.LogLevel.Warning);
                        break;
                    }
                }
            }
        }
Example #2
0
        /// <summary>
        /// DeRez an object from the simulator and return to inventory
        /// </summary>
        /// <param name="objectLocalID">The simulator Local ID of the object</param>
        /// <param name="destType">The type of destination from the <seealso cref="DeRezDestination"/> enum</param>
        /// <param name="destFolder">The destination inventory folders <seealso cref="UUID"/> -or- 
        /// if DeRezzing object to a tasks Inventory, the Tasks <seealso cref="UUID"/></param>
        /// <param name="transactionID">The transaction ID for this request which
        /// can be used to correlate this request with other packets</param>
        /// <remarks>If objectLocalID is a child primitive in a linkset, the entire linkset will be derezzed</remarks>
        public void RequestDeRezToInventory(uint objectLocalID, DeRezDestination destType, UUID destFolder, UUID transactionID)
        {
            DeRezObjectPacket take = new DeRezObjectPacket();

            take.AgentData.AgentID = Client.Self.AgentID;
            take.AgentData.SessionID = Client.Self.SessionID;
            take.AgentBlock = new DeRezObjectPacket.AgentBlockBlock();
            take.AgentBlock.GroupID = UUID.Zero;
            take.AgentBlock.Destination = (byte)destType;
            take.AgentBlock.DestinationID = destFolder;
            take.AgentBlock.PacketCount = 1;
            take.AgentBlock.PacketNumber = 1;
            take.AgentBlock.TransactionID = transactionID;

            take.ObjectData = new DeRezObjectPacket.ObjectDataBlock[1];
            take.ObjectData[0] = new DeRezObjectPacket.ObjectDataBlock();
            take.ObjectData[0].ObjectLocalID = objectLocalID;

            Client.Network.SendPacket(take);
        }
Example #3
0
        public void DeRezObject(GridClient cliente, uint rootLocalId, DeRezDestination destinationType, UUID destinationFolder)
        {
            // wait for the kill object packet, otherwise we risk logging out before everything is in place
            objectKillWait = new AutoResetEvent(false);
            newInventoryItemID = UUID.Zero;
            objectInInventoryWait = new AutoResetEvent(false);

            EventHandler<TaskItemReceivedEventArgs>HandleOnTaskItemReceived = new EventHandler<TaskItemReceivedEventArgs>(Inventory_TaskItemReceived);
            EventHandler<KillObjectEventArgs> kic = new EventHandler<KillObjectEventArgs>(Objects_KillObject);

            cliente.Objects.KillObject += kic;
            cliente.Inventory.TaskItemReceived+=HandleOnTaskItemReceived;
            cliente.Objects.RequestObject(cliente.Network.Simulators[0], rootLocalId);
            cliente.Inventory.RequestDeRezToInventory(rootLocalId, destinationType, destinationFolder, UUID.Random());

            //bool processCompleted = WaitHandle.WaitAll(new WaitHandle[] { objectKillWait, objectInInventoryWait }, 20 * 1000, true);
            bool processCompleted1 = WaitHandle.WaitAll(new WaitHandle[] { objectKillWait }, 20 * 1000, true);
            bool processCompleted2 = WaitHandle.WaitAll(new WaitHandle[] { objectInInventoryWait }, 20 * 1000, true);

            cliente.Objects.KillObject -= kic;
            cliente.Inventory.TaskItemReceived -= HandleOnTaskItemReceived;
            if (!processCompleted1 || !processCompleted2)
            {
                if (!gotObjectInventory)
                    registaLog("Falhou a remoção do objecto " + nomeDoObjectoColocado + ", excedeu o temp enquanto esperava pela confirmação do ammazenamento no inventário");
                if (!gotKillObject)
                    registaLog("Falhou a remoção do objecto " + nomeDoObjectoColocado + ", o objecto não foi removido do cenário");
            }
        }