public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) { remoteClient.RunAttachmentOperation(() => { ScenePresence sp = this.GetScenePresence(remoteClient.AgentId); if (sp == null) return; SceneObjectGroup group = sp.GetAttachmentByItemID(itemID); if (group == null) return; if (group.OwnerID != remoteClient.AgentId) return; this.EventManager.TriggerOnDetachObject(group.LocalId); DetachSingleAttachmentToInvSync(itemID, remoteClient); }); }
public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient) { remoteClient.RunAttachmentOperation(() => { SceneObjectPart part = GetSceneObjectPart(itemID); if (part == null || part.ParentGroup == null) return; UUID inventoryID = part.ParentGroup.GetFromItemID(); ScenePresence presence; if (TryGetAvatar(remoteClient.AgentId, out presence)) { int landImpact = part.ParentGroup.LandImpact; bool isTemp = (part.GetEffectiveObjectFlags() & PrimFlags.TemporaryOnRez) != 0; if (!Permissions.CanRezObject(landImpact, remoteClient.AgentId, UUID.Zero, presence.AbsolutePosition, isTemp)) return; this.EventManager.TriggerOnDetachObject(part.ParentGroup.LocalId); presence.Appearance.DetachAttachment(itemID); IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>(); if (ava != null) { ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance, null, null); } part.ParentGroup.DetachToGround(); CachedUserInfo userInfo = CommsManager.UserService.GetUserDetails(remoteClient.AgentId); if (userInfo != null) { userInfo.CheckedDeleteItem(remoteClient.AgentId, inventoryID); remoteClient.SendRemoveInventoryItem(inventoryID); } } }); }
public void AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, bool append, bool silent, AttachFlags flags) { controllingClient.RunAttachmentOperation(() => { m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, append, silent, flags); }); }
public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects) { remoteClient.RunAttachmentOperation(() => { ScenePresence presence; if (!TryGetAvatar(remoteClient.AgentId, out presence)) return; if (header.FirstDetachAll) { foreach (UUID itemId in presence.CollectAttachmentItemIds()) this.DetachSingleAttachmentToInvSync(itemId, remoteClient); this.ClearAllAttachments(presence); } bool updated = false; foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects) { bool append = (((uint)obj.AttachmentPt & 0x80) != 0); // Are we appending? uint attachPoint = ((uint)obj.AttachmentPt & 0x7f); // And strip the append bit // Are we already attached? if (presence.Appearance.GetAttachmentForItem(obj.ItemID) == null) { SceneObjectGroup sog = RezSingleAttachmentSync(remoteClient, obj.ItemID, attachPoint, append); if (sog != null) updated = true; } } if (updated) { IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>(); if (ava != null) ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance, null, null); } }); }
/// <summary> /// Rezzes a single attachment and returns UUID.Zero. Can not be called if you need the ID /// </summary> /// <param name="remoteClient"></param> /// <param name="itemID"></param> /// <param name="AttachmentPt"></param> /// <param name="append"></param> /// <returns></returns> public UUID RezSingleAttachment(IClientAPI client, UUID itemID, uint AttachmentPt, bool append) { ScenePresence presence; if (!TryGetAvatar(client.AgentId, out presence)) return UUID.Zero; client.RunAttachmentOperation(() => { SceneObjectGroup sog = RezSingleAttachmentSync(client, itemID, AttachmentPt, append); if (sog != null) { IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>(); if (ava != null) ava.UpdateDatabase(client.AgentId, presence.Appearance, null, null); } }); return UUID.Zero; }
/// <summary> /// Event Handling routine for Attach Object /// </summary> /// <param name="remoteClient"></param> /// <param name="objectLocalID"></param> /// <param name="AttachmentPt"></param> /// <param name="rot"></param> protected internal void AttachObject( IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, bool appendMode, Quaternion rot, bool silent) { remoteClient.RunAttachmentOperation(() => { // If we can't take it, we can't attach it! // SceneObjectPart part = m_parentScene.GetSceneObjectPart(objectLocalID); if (part == null) return; if (!m_parentScene.Permissions.CanTakeObject(part.ParentGroup.UUID, remoteClient.AgentId)) return; SceneObjectGroup group = part.ParentGroup; group.Rotation = rot; AttachObject(remoteClient, objectLocalID, AttachmentPt, appendMode, false, AttachFlags.FromInWorld); ScenePresence sp = m_parentScene.GetScenePresence(remoteClient.AgentId); UUID itemID = group.GetFromItemID(); if (sp != null) sp.Appearance.SetAttachment((int)AttachmentPt, appendMode, itemID, UUID.Zero); }); }