public override void AssetTransferComplete() { AssetData data; List <ObjectGroup> objgroups; try { data = m_Scene.AssetService[AssetID]; } catch (Exception e) { m_Log.Error(string.Format("Failed to rez object from asset {0}", AssetID), e); SendAlertMessage("ALERT: CantFindObject"); return; } try { objgroups = ObjectXML.FromAsset(data, m_RezzingAgent); } catch (Exception e) { m_Log.Error(string.Format("Unable to decode asset {0} to rez", data.ID), e); SendAlertMessage("ALERT: RezAttemptFailed"); return; } if (objgroups.Count == 1 && m_SourceItem != null) { objgroups[0].Name = m_SourceItem.Name; } try { foreach (ObjectGroup grp in objgroups) { if (m_Scene.CanRez(m_RezzingAgent.ID, m_RezzingAgent, grp.GlobalPosition)) { if (m_Scene.GroupsService?.Members.ContainsKey(m_RezzingAgent, m_RezzingGroup, m_RezzingAgent) ?? false) { grp.Group = m_RezzingGroup; } m_Scene.RezObject(grp, m_RezzingAgent, m_SourceItem); } } } catch (Exception e) { m_Log.Error(string.Format("Failed to rez object in scene {0} ({1})", m_Scene.Name, m_Scene.ID), e); SendAlertMessage("ALERT: RezAttemptFailed"); return; } }
public override void AssetTransferComplete() { AssetData data; var objgroups = new List <ObjectGroup>(); foreach (UUID assetid in m_ItemAssetIDs) { try { data = m_Scene.AssetService[assetid]; } catch (Exception e) { m_Log.Error(string.Format("Failed to rez object from asset {0}", assetid), e); SendAlertMessage("ALERT: CantFindObject"); return; } try { objgroups.AddRange(ObjectXML.FromAsset(data, m_RezzingAgent)); } catch (Exception e) { m_Log.Error(string.Format("Unable to decode asset {0} to rez", data.ID), e); SendAlertMessage("ALERT: RezAttemptFailed"); return; } } if (objgroups.Count == 1 && m_RezParams.SourceItem != null) { objgroups[0].Name = m_RezParams.SourceItem.Name; } try { m_Scene.RezObjects(objgroups, m_RezParams); } catch (Exception e) { m_Log.Error(string.Format("Failed to rez object in scene {0} ({1})", m_Scene.Name, m_Scene.ID), e); SendAlertMessage("ALERT: RezAttemptFailed"); } }
public static UUID GenerateNextOwnerAsset(this AssetServiceInterface assetService, UUID firstLevelAssetID) { var assetIDs = new List <UUID>(); var replaceAssets = new Dictionary <UUID, UUID>(); var objectAssetIDs = new List <UUID>(); assetIDs.Add(firstLevelAssetID); int pos = 0; while (pos < assetIDs.Count) { UUID assetid = assetIDs[pos++]; AssetMetadata objmeta; if (assetService.Metadata.TryGetValue(assetid, out objmeta)) { if (objmeta.Type == AssetType.Object) { if (!objectAssetIDs.Contains(assetid)) { objectAssetIDs.Add(assetid); } assetIDs.AddRange(ObjectReferenceDecoder.GetReferences(assetService[assetid])); if (!replaceAssets.ContainsKey(assetid)) { replaceAssets.Add(assetid, UUID.Random); } } else if (objmeta.Type == AssetType.Notecard) { if (!objectAssetIDs.Contains(assetid)) { objectAssetIDs.Add(assetid); } var nc = new Notecard(assetService[assetid]); foreach (NotecardInventoryItem item in nc.Inventory.Values) { if ((item.AssetType == AssetType.Object || item.AssetType == AssetType.Notecard) && !objectAssetIDs.Contains(item.AssetID)) { objectAssetIDs.Add(item.AssetID); } } assetIDs.InsertRange(0, nc.References); if (!replaceAssets.ContainsKey(assetid)) { replaceAssets.Add(assetid, UUID.Random); } } } } objectAssetIDs.Reverse(); foreach (UUID objectid in objectAssetIDs) { AssetData data; AssetData newAsset; if (assetService.TryGetValue(objectid, out data)) { switch (data.Type) { case AssetType.Object: List <ObjectGroup> grps = ObjectXML.FromAsset(data, UGUI.Unknown); foreach (ObjectGroup grp in grps) { foreach (ObjectPart part in grp.Values) { foreach (ObjectPartInventoryItem item in part.Inventory.Values) { if (item.NextOwnerAssetID == UUID.Zero) { UUID replaceAssetID; part.Inventory.SetNextOwnerAssetID( item.ID, replaceAssets.TryGetValue(item.AssetID, out replaceAssetID) ? replaceAssetID : item.AssetID); } } } } newAsset = (grps.Count == 1) ? grps[0].Asset(UGUI.Unknown, XmlSerializationOptions.AdjustForNextOwner | XmlSerializationOptions.WriteXml2) : grps.Asset(UGUI.Unknown, XmlSerializationOptions.AdjustForNextOwner | XmlSerializationOptions.WriteXml2); newAsset.ID = replaceAssets[objectid]; newAsset.CreateTime = data.CreateTime; assetService.Store(newAsset); break; case AssetType.Notecard: var nc = new Notecard(data); foreach (NotecardInventoryItem item in nc.Inventory.Values) { UUID replace; if (replaceAssets.TryGetValue(item.AssetID, out replace)) { item.AssetID = replace; } break; } break; default: break; } } } UUID finalAssetID; return(replaceAssets.TryGetValue(firstLevelAssetID, out finalAssetID) ? finalAssetID : firstLevelAssetID); }
private void AttachFromInventory(AssetData data, UUID itemID) { List <ObjectGroup> objgroups; #if DEBUG m_Log.DebugFormat("Deserializing object asset {0} for agent {1} {2} ({3})", data.ID, NamedOwner.FirstName, NamedOwner.LastName, NamedOwner.ID); #endif try { objgroups = ObjectXML.FromAsset(data, Owner); } catch (Exception e) { m_Log.WarnFormat("Deserialization error for object asset {0} for agent {1} {2} ({3}): {4}: {5}", data.ID, NamedOwner.FirstName, NamedOwner.LastName, NamedOwner.ID, e.GetType().FullName, e.ToString()); return; } if (objgroups.Count != 1) { return; } ObjectGroup grp = objgroups[0]; foreach (ObjectPart part in grp.Values) { if (part.Shape.PCode == PrimitiveCode.Grass || part.Shape.PCode == PrimitiveCode.Tree || part.Shape.PCode == PrimitiveCode.NewTree) { return; } } AttachmentPoint attachAt = grp.AttachPoint; if (attachAt == AttachmentPoint.NotAttached) { grp.AttachPoint = AttachmentPoint.LeftHand; grp.AttachedPos = Vector3.Zero; grp.AttachedRot = Quaternion.Identity; } grp.FromItemID = itemID; grp.IsAttached = true; grp.Position = grp.AttachedPos; grp.Rotation = grp.AttachedRot; grp.IsChangedEnabled = true; #if DEBUG m_Log.DebugFormat("Adding attachment asset {0} at {4} for agent {1} {2} ({3})", data.ID, NamedOwner.FirstName, NamedOwner.LastName, NamedOwner.ID, grp.AttachPoint.ToString()); #endif SceneInterface scene = CurrentScene; try { scene.Add(grp); Attachments.Add(grp.AttachPoint, grp); } catch { return; } }
public override void AssetTransferComplete() { AssetData data; List <ObjectGroup> objgroups; try { data = m_Scene.AssetService[AssetID]; } catch (Exception e) { m_Log.Error(string.Format("Failed to rez attachment from asset {0}", AssetID), e); SendAlertMessage("ALERT: CantFindObject"); return; } #if DEBUG m_Log.DebugFormat("Deserializing object asset {0} for agent {1}", data.ID, m_RezzingAgent.ToString()); #endif try { objgroups = ObjectXML.FromAsset(data, m_RezzingAgent); } catch (Exception e) { m_Log.WarnFormat("Deserialization error for object asset {0} for agent {1}: {2}: {3}", data.ID, m_RezzingAgent.ToString(), e.GetType().FullName, e.ToString()); SendAlertMessage("ALERT: InvalidObjectParams"); return; } if (objgroups.Count != 1) { SendAlertMessage("ALERT: InvalidObjectParams"); return; } ObjectGroup grp = objgroups[0]; bool attachPointChanged = false; foreach (var part in grp.Values) { if (part.Shape.PCode == PrimitiveCode.Grass || part.Shape.PCode == PrimitiveCode.Tree || part.Shape.PCode == PrimitiveCode.NewTree) { SendAlertMessage("ALERT: WhyAreYouTryingToWearShrubbery"); return; } } var attachAt = m_AttachPoint & AttachmentPoint.PositionMask; if (attachAt != AttachmentPoint.Default && attachAt != grp.AttachPoint) { grp.AttachedPos = Vector3.Zero; grp.AttachedRot = Quaternion.Identity; attachPointChanged = true; } if (attachAt == AttachmentPoint.Default) { attachAt = grp.AttachPoint; if (attachAt == AttachmentPoint.NotAttached) { grp.AttachPoint = AttachmentPoint.LeftHand; grp.AttachedPos = Vector3.Zero; grp.AttachedRot = Quaternion.Identity; } } grp.Owner = m_RezzingAgent; grp.FromItemID = m_SourceItem.ID; grp.IsAttached = true; grp.Position = grp.AttachedPos; grp.Rotation = grp.AttachedRot; grp.IsChangedEnabled = true; if (attachPointChanged) { grp.AttachPoint = attachAt; } #if DEBUG m_Log.DebugFormat("Adding attachment asset {0} at {4} for agent {1}", data.ID, m_RezzingAgent.ToString()); #endif try { m_Scene.RezObject(grp, m_RezzingAgent, m_SourceItem); m_AttachmentsList.Add(grp.AttachPoint, grp); } catch { SendAlertMessage("ALERT: RezAttemptFailed"); return; } grp.PostEvent(new AttachEvent { ObjectID = grp.Owner.ID }); }