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; } } } }
/// <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); }
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"); } }