public ISceneEntity CreateEntity( ISceneEntity baseEntity, UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) { if (Array.IndexOf(creationCapabilities, (PCode)shape.PCode) < 0) { MainConsole.Instance.DebugFormat("[VEGETATION]: PCode {0} not handled by {1}", shape.PCode, Name); return(null); } ISceneChildEntity rootPart = baseEntity.GetChildPart(baseEntity.UUID); // if grass or tree, make phantom //rootPart.TrimPermissions(); rootPart.AddFlag(PrimFlags.Phantom); if (rootPart.Shape.PCode != (byte)PCode.Grass) { AdaptTree(ref shape); } m_scene.SceneGraph.AddPrimToScene(baseEntity); baseEntity.SetGroup(groupID, ownerID, true); baseEntity.ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate); return(baseEntity); }
public ISceneEntity CreateEntity( ISceneEntity sceneObject, UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) { if (Array.IndexOf(creationCapabilities, (PCode)shape.PCode) < 0) { MainConsole.Instance.DebugFormat("[VEGETATION]: PCode {0} not handled by {1}", shape.PCode, Name); return(null); } ISceneChildEntity rootPart = sceneObject.GetChildPart(sceneObject.UUID); rootPart.AddFlag(PrimFlags.Phantom); if (rootPart.Shape.PCode != (byte)PCode.Grass) { // Tree size has to be adapted depending on its type switch ((Tree)rootPart.Shape.State) { case Tree.Cypress1: case Tree.Cypress2: case Tree.Palm1: case Tree.Palm2: case Tree.WinterAspen: rootPart.Scale = new Vector3(4, 4, 10); break; case Tree.WinterPine1: case Tree.WinterPine2: rootPart.Scale = new Vector3(4, 4, 20); break; case Tree.Dogwood: rootPart.Scale = new Vector3(6.5f, 6.5f, 6.5f); break; // case... other tree types // tree.Scale = new Vector3(?, ?, ?); // break; default: rootPart.Scale = new Vector3(4, 4, 4); break; } } sceneObject.SetGroup(groupID, UUID.Zero, false); m_scene.SceneGraph.AddPrimToScene(sceneObject); sceneObject.ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate); return(sceneObject); }
public ISceneEntity CreateEntity( ISceneEntity baseEntity, UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) { if (Array.IndexOf(creationCapabilities, (PCode) shape.PCode) < 0) { MainConsole.Instance.DebugFormat("[VEGETATION]: PCode {0} not handled by {1}", shape.PCode, Name); return null; } ISceneChildEntity rootPart = baseEntity.GetChildPart(baseEntity.UUID); // if grass or tree, make phantom //rootPart.TrimPermissions(); rootPart.AddFlag(PrimFlags.Phantom); if (rootPart.Shape.PCode != (byte) PCode.Grass) AdaptTree(ref shape); m_scene.SceneGraph.AddPrimToScene(baseEntity); baseEntity.SetGroup(groupID, ownerID, true); baseEntity.ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate); return baseEntity; }
public ISceneEntity GetRezReadySceneObject(TaskInventoryItem item) { byte[] rezAsset = m_part.ParentGroup.Scene.AssetService.GetData(item.AssetID.ToString()); if (null == rezAsset) { MainConsole.Instance.WarnFormat( "[PRIM INVENTORY]: Could not find asset {0} for inventory item {1} in {2}", item.AssetID, item.Name, m_part.Name); return(null); } string xmlData = Utils.BytesToString(rezAsset); ISceneEntity group = SceneEntitySerializer.SceneObjectSerializer.FromOriginalXmlFormat(xmlData, m_part.ParentGroup .Scene); if (group == null) { return(null); } group.IsDeleted = false; foreach (ISceneChildEntity part in group.ChildrenEntities()) { part.IsLoading = false; } //Reset IDs, etc m_part.ParentGroup.Scene.SceneGraph.PrepPrimForAdditionToScene(group); ISceneChildEntity rootPart = group.GetChildPart(group.UUID); // Since renaming the item in the inventory does not affect the name stored // in the serialization, transfer the correct name from the inventory to the // object itself before we rez. rootPart.Name = item.Name; rootPart.Description = item.Description; List <ISceneChildEntity> partList = group.ChildrenEntities(); group.SetGroup(m_part.GroupID, group.OwnerID, false); if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) { if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions()) { foreach (ISceneChildEntity part in partList) { part.EveryoneMask = item.EveryonePermissions; part.NextOwnerMask = item.NextPermissions; } group.ApplyNextOwnerPermissions(); } } foreach (ISceneChildEntity part in partList) { if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) { part.LastOwnerID = part.OwnerID; part.OwnerID = item.OwnerID; part.Inventory.ChangeInventoryOwner(item.OwnerID); } part.EveryoneMask = item.EveryonePermissions; part.NextOwnerMask = item.NextPermissions; } rootPart.TrimPermissions(); return(group); }
/// <summary> /// Create a tree entity /// </summary> /// <param name="sceneObject">Scene object.</param> /// <param name="ownerID"></param> /// <param name="groupID"></param> /// <param name="pos"></param> /// <param name="rot"></param> /// <param name="shape"></param> /// <returns>The tree entity created, or null if the creation failed</returns> public ISceneEntity CreateEntity( ISceneEntity sceneObject, UUID ownerID, UUID groupID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape) { if ( Array.IndexOf( creationCapabilities, ( PCode)shape.PCode ) < 0 ) { MainConsole.Instance.Debug ( "[VEGETATION]: PCode " + shape.PCode + " not handled by "+ Name ); return null; } ISceneChildEntity rootPart = sceneObject.GetChildPart(sceneObject.UUID); rootPart.AddFlag(PrimFlags.Phantom); if ( rootPart.Shape.PCode != (byte)PCode.Grass ) { // Tree size has to be adapted depending on its type switch ( (Tree)rootPart.Shape.State ) { case Tree.Cypress1: case Tree.Cypress2: case Tree.Palm1: case Tree.Palm2: case Tree.WinterAspen: rootPart.Scale = new Vector3(4, 4, 10); break; case Tree.WinterPine1: case Tree.WinterPine2: rootPart.Scale = new Vector3(4, 4, 20); break; case Tree.Dogwood: rootPart.Scale = new Vector3(6.5f, 6.5f, 6.5f); break; // case... other tree types // tree.Scale = new Vector3(?, ?, ?); // break; default: rootPart.Scale = new Vector3(4, 4, 4); break; } } sceneObject.SetGroup( groupID, UUID.Zero, false ); m_scene.SceneGraph.AddPrimToScene( sceneObject ); sceneObject.ScheduleGroupUpdate( PrimUpdateFlags.ForcedFullUpdate ); return sceneObject; }
public ISceneEntity RezSingleAttachmentFromInventory( IClientAPI remoteClient, UUID itemID, UUID assetID, int AttachmentPt, bool updateUUIDs) { MainConsole.Instance.DebugFormat( "[ATTACHMENTS MODULE]: Rezzing attachment to point {0} from item {1} for {2}", (AttachmentPoint)AttachmentPt, itemID, remoteClient.Name); IInventoryAccessModule invAccess = m_scene.RequestModuleInterface <IInventoryAccessModule>(); if (invAccess != null) { InventoryItemBase item = null; ISceneEntity objatt = assetID == UUID.Zero ? invAccess.CreateObjectFromInventory(remoteClient, itemID, out item) : invAccess.CreateObjectFromInventory(remoteClient, itemID, assetID, null); if (objatt != null) { #region Set up object for attachment status if (item != null) { assetID = item.AssetID; // Since renaming the item in the inventory does not affect the name stored // in the serialization, transfer the correct name from the inventory to the // object itself before we rez. objatt.RootChild.Name = item.Name; objatt.RootChild.Description = item.Description; } objatt.RootChild.Flags |= PrimFlags.Phantom; objatt.RootChild.IsAttachment = true; objatt.SetFromItemID(itemID, assetID); List <ISceneChildEntity> partList = new List <ISceneChildEntity>(objatt.ChildrenEntities()); foreach (ISceneChildEntity part in partList) { part.AttachedAvatar = remoteClient.AgentId; } objatt.SetGroup(remoteClient.ActiveGroupId, remoteClient.AgentId, false); if (objatt.RootChild.OwnerID != remoteClient.AgentId) { //Need to kill the for sale here objatt.RootChild.ObjectSaleType = 0; objatt.RootChild.SalePrice = 10; if (m_scene.Permissions.PropagatePermissions()) { if (item == null) { item = m_scene.InventoryService.GetItem(remoteClient.AgentId, itemID); } if (item == null) { return(null); } if ((item.CurrentPermissions & 8) != 0) { foreach (ISceneChildEntity part in partList) { part.EveryoneMask = item.EveryOnePermissions; part.NextOwnerMask = item.NextPermissions; part.GroupMask = 0; // DO NOT propagate here } } objatt.ApplyNextOwnerPermissions(); } } foreach (ISceneChildEntity part in partList) { if (part.OwnerID != remoteClient.AgentId) { part.LastOwnerID = part.OwnerID; part.OwnerID = remoteClient.AgentId; part.Inventory.ChangeInventoryOwner(remoteClient.AgentId); } } objatt.RootChild.TrimPermissions(); objatt.RootChild.IsAttachment = true; objatt.IsDeleted = false; //Update the ItemID with the new item objatt.SetFromItemID(itemID, assetID); //We also have to reset the IDs so that it doesn't have the same IDs as one inworld (possibly)! ISceneEntity[] atts = GetAttachmentsForAvatar(remoteClient.AgentId); foreach (var obj in atts) { if (obj.UUID == objatt.UUID) { updateUUIDs = false; //If the user is already wearing it, don't readd } } bool forceUpdateOnNextDeattach = false; try { bool foundDuplicate = false; foreach (var obj in atts) { if (obj.RootChild.FromUserInventoryItemID == objatt.RootChild.FromUserInventoryItemID) { foundDuplicate = true; } } IEntity e; if (!m_scene.SceneGraph.TryGetEntity(objatt.UUID, out e)) //if (updateUUIDs) { foreach (var prim in objatt.ChildrenEntities()) { prim.LocalId = 0; } bool success = m_scene.SceneGraph.RestorePrimToScene(objatt, false); if (!success) { MainConsole.Instance.Error("[AttachmentModule]: Failed to add attachment " + objatt.Name + " for user " + remoteClient.Name + "!"); return(null); } } else { if (!foundDuplicate) { //If the user has information stored about this object, we need to force updating next time if (m_scene.SceneGraph.AddPrimToScene(objatt)) { forceUpdateOnNextDeattach = true; } } else { if (e as ISceneEntity != null) { (e as ISceneEntity).ScheduleGroupUpdate(PrimUpdateFlags.ForcedFullUpdate); } return(e as ISceneEntity); //It was already added } } } catch { } //If we updated the attachment, we need to save the change IScenePresence presence = m_scene.GetScenePresence(remoteClient.AgentId); if (presence != null) { FindAttachmentPoint(remoteClient, objatt.LocalId, objatt, AttachmentPt, assetID, forceUpdateOnNextDeattach, false); } else { objatt = null; //Presence left, kill the attachment } #endregion } else { MainConsole.Instance.WarnFormat( "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}", itemID, remoteClient.Name, AttachmentPt); } return(objatt); } return(null); }