public int llGetInventoryPermMask(IScriptInstance script, string name, int mask) { LLPrimitive prim = script.Host as LLPrimitive; if (prim == null) { return(0); } LLInventoryTaskItem found = prim.Inventory.FindItem(item => item.Name == name); if (found != null) { switch (mask) { case LSLConstants.MASK_BASE: return((int)found.Permissions.BaseMask); case LSLConstants.MASK_OWNER: return((int)found.Permissions.OwnerMask); case LSLConstants.MASK_GROUP: return((int)found.Permissions.GroupMask); case LSLConstants.MASK_EVERYONE: return((int)found.Permissions.EveryoneMask); case LSLConstants.MASK_NEXT: return((int)found.Permissions.NextOwnerMask); } } return(0); }
/// <summary> /// Lookup a task inventory item AssetID by item name /// </summary> /// <param name="script">Calling script</param> /// <param name="name">Name of an inventory item</param> /// <returns>AssetID, or UUID.Zero if the item was not found in prim /// inventory</returns> private UUID InventoryKey(IScriptInstance script, string name) { if (script.Host is LLPrimitive) { PrimInventory inventory = ((LLPrimitive)script.Host).Inventory; LLInventoryTaskItem item = inventory.FindItem(delegate(LLInventoryTaskItem match) { return(match.Name == name); }); if (item != null) { return(item.AssetID); } } return(UUID.Zero); }
/// <summary> /// Lookup the given script's AssetID /// </summary> /// <param name="script">Calling script</param> /// <returns>AssetID, or UUID.Zero if something went wrong</returns> protected UUID InventorySelf(IScriptInstance script) { if (script.Host is LLPrimitive) { PrimInventory inventory = ((LLPrimitive)script.Host).Inventory; LLInventoryTaskItem item = inventory.FindItem(delegate(LLInventoryTaskItem match) { return(match.ID == script.ID); }); if (item != null) { return(item.AssetID); } } return(UUID.Zero); }
private void UpdatePrimFlags(LLPrimitive obj) { IList <LLInventoryTaskItem> scripts = obj.Inventory.GetScripts(); LSLEventFlags eventFlags = 0; bool hasCollisionEvents; bool scripted = false; if (scripts.Count > 0) { scripted = true; // Aggregate LSLEventFlags for all of the running scripts in this prim lock (m_syncRoot) { for (int i = 0; i < scripts.Count; i++) { LLInventoryTaskItem scriptItem = scripts[i]; LSLScriptInstance script; if (m_scripts.TryGetValue(scriptItem.ID, out script)) { eventFlags |= script.GetEventsForState(script.State); } } } } PrimFlags oldFlags = obj.Prim.Flags; PrimFlags newFlags = oldFlags; newFlags &= ~(PrimFlags.Scripted | PrimFlags.Touch | PrimFlags.Money); if (scripted) { newFlags |= PrimFlags.Scripted; } newFlags |= LSLEventFlagsToPrimFlags(eventFlags, out hasCollisionEvents); // FIXME: Do something with hasCollisionEvents if (newFlags != oldFlags) { obj.Prim.Flags = newFlags; m_scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.PrimFlags); } }
public int llGetInventoryType(IScriptInstance script, string name) { LLPrimitive prim = script.Host as LLPrimitive; if (prim == null) { return(LSLConstants.INVENTORY_NONE); } LLInventoryTaskItem found = prim.Inventory.FindItem(item => item.Name == name); if (found != null) { return((int)found.AssetType); } return(LSLConstants.INVENTORY_NONE); }
public string llGetScriptName(IScriptInstance script) { LLPrimitive prim = script.Host as LLPrimitive; if (prim == null) { return(String.Empty); } LLInventoryTaskItem scriptItem = prim.Inventory.FindItem(item => item.ID == script.ID); if (scriptItem != null) { return(scriptItem.Name); } return(String.Empty); }
private void UpdateTaskInventoryHandler(Packet packet, LLAgent agent) { UpdateTaskInventoryPacket update = (UpdateTaskInventoryPacket)packet; LLInventoryTaskItem item; ISceneEntity targetObj; if (update.UpdateData.Key != 0) { m_log.Warn("Got an UpdateTaskInventory packet with a Key of " + update.UpdateData.Key); return; } if (m_scene.TryGetEntity(update.UpdateData.LocalID, out targetObj) && targetObj is LLPrimitive) { LLPrimitive targetPrim = (LLPrimitive)targetObj; // Updating an existing item in the task inventory if (targetPrim.Inventory.TryGetItem(update.InventoryData.ItemID, out item)) { if (update.InventoryData.TransactionID != UUID.Zero) item.AssetID = UUID.Combine(update.InventoryData.TransactionID, agent.SecureSessionID); item.Description = Utils.BytesToString(update.InventoryData.Description); item.Flags = update.InventoryData.Flags; item.GroupID = update.InventoryData.GroupID; item.GroupOwned = update.InventoryData.GroupOwned; item.Name = Utils.BytesToString(update.InventoryData.Name); item.Permissions = new Permissions(update.InventoryData.BaseMask, update.InventoryData.EveryoneMask, update.InventoryData.GroupMask, update.InventoryData.NextOwnerMask, update.InventoryData.OwnerMask); item.SalePrice = update.InventoryData.SalePrice; item.SaleType = (SaleType)update.InventoryData.SaleType; targetPrim.Inventory.AddOrUpdateItem(item, true); m_log.Debug(agent.Name + " updated task inventory item: " + item.Name); SignalTaskInventoryChange(agent, targetPrim); } else if (m_inventory != null) { // Copying from agent inventory to task inventory InventoryBase obj; if (m_inventory.TryGetInventory(agent.ID, update.InventoryData.ItemID, out obj)) { if (obj is InventoryItem) { // Create a new item in the task inventory LLInventoryItem fromItem = new LLInventoryItem((InventoryItem)obj); item = new LLInventoryTaskItem(); //item.ID will be assigned in AddOrUpdateItem item.AssetID = fromItem.AssetID; item.ContentType = fromItem.ContentType; item.CreationDate = fromItem.CreationDate; item.CreatorID = fromItem.CreatorID; item.Description = fromItem.Description; item.Flags = fromItem.ExtraData["Flags"].AsUInteger(); item.GrantedPermissions = 0; item.GroupID = fromItem.ExtraData["group_id"].AsUUID(); item.GroupOwned = fromItem.ExtraData["group_owned"].AsBoolean(); item.Name = fromItem.Name; item.OwnerID = agent.ID; item.ParentID = update.InventoryData.FolderID; item.ParentObjectID = targetPrim.ID; item.PermissionGranter = UUID.Zero; item.Permissions = fromItem.Permissions; item.SalePrice = fromItem.ExtraData["sale_price"].AsInteger(); item.SaleType = (SaleType)fromItem.ExtraData["sale_type"].AsInteger(); targetPrim.Inventory.AddOrUpdateItem(item, false); m_log.Debug(agent.Name + " created new task inventory item: " + item.Name); SignalTaskInventoryChange(agent, targetPrim); } else { m_log.Error("[TODO] Handle dropping folders in task inventory"); } } else { m_log.Warn(agent.Name + " sent an UpdateTaskInventory packet requesting unknown " + "(or failed to fetch) inventory item " + update.InventoryData.ItemID); } } else { m_log.Warn(agent.Name + "attempted to copy inventory item " + update.InventoryData.ItemID + " to task inventory, but we have no IInventoryClient"); } } else { m_log.Warn(agent.Name + " attempted to update task inventory for prim " + update.UpdateData.LocalID + " that does not exist in this scene"); } }
private void RezScriptHandler(Packet packet, LLAgent agent) { RezScriptPacket rez = (RezScriptPacket)packet; LLInventoryTaskItem scriptItem; ISceneEntity targetObj; if (m_scene.TryGetEntity(rez.UpdateBlock.ObjectLocalID, out targetObj) && targetObj is LLPrimitive) { LLPrimitive targetPrim = (LLPrimitive)targetObj; if (rez.InventoryBlock.ItemID != UUID.Zero) { if (targetPrim.Inventory.TryGetItem(rez.InventoryBlock.ItemID, out scriptItem)) { // Rezzing a script from task inventory UUID assetID = UUID.Combine(rez.InventoryBlock.TransactionID, agent.SecureSessionID); // Update task inventory with the new script source assetID scriptItem.AssetID = assetID; targetPrim.Inventory.AddOrUpdateItem(scriptItem, true); // Run the script if (m_scriptEngine != null) m_scriptEngine.RezScript(scriptItem.ID, assetID, targetObj, 0); else m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine"); SignalTaskInventoryChange(agent, targetPrim); } else if (m_inventory != null) { InventoryBase obj; if (m_inventory.TryGetInventory(agent.ID, rez.InventoryBlock.ItemID, out obj) && obj is InventoryItem && ((InventoryItem)obj).ContentType == "application/vnd.ll.lsltext") { LLInventoryItem sourceItem = new LLInventoryItem((InventoryItem)obj); // Rezzing a script from agent inventory scriptItem = new LLInventoryTaskItem(); scriptItem.AssetID = sourceItem.AssetID; scriptItem.ContentType = "application/vnd.ll.lsltext"; scriptItem.CreationDate = DateTime.UtcNow; scriptItem.CreatorID = agent.ID; scriptItem.Description = sourceItem.Description; scriptItem.ID = UUID.Random(); scriptItem.Name = sourceItem.Name; scriptItem.OwnerID = sourceItem.OwnerID; scriptItem.ParentID = sourceItem.ParentID; scriptItem.ParentObjectID = targetPrim.ID; scriptItem.Flags = sourceItem.Flags; scriptItem.GroupID = sourceItem.GroupID; scriptItem.GroupOwned = sourceItem.GroupOwned; scriptItem.Permissions = sourceItem.Permissions; scriptItem.SalePrice = sourceItem.SalePrice; scriptItem.SaleType = sourceItem.SaleType; targetPrim.Inventory.AddOrUpdateItem(scriptItem, false); m_log.Info(agent.Name + " copied agent inventory script to task inventory: " + scriptItem.Name); // Run the script if (m_scriptEngine != null) m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0); else m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine"); SignalTaskInventoryChange(agent, targetPrim); } else { m_log.Warn(agent.Name + " called RezScript for unknown inventory script " + rez.InventoryBlock.ItemID); } } else { m_log.Warn(agent.Name + "attempted to copy (and rez) script " + rez.InventoryBlock.ItemID + " to task inventory, but we have no IInventoryClient"); } } else { // Rezzing a new script scriptItem = new LLInventoryTaskItem(); scriptItem.AssetID = DEFAULT_SCRIPT; scriptItem.ContentType = "application/vnd.ll.lsltext"; scriptItem.CreationDate = DateTime.UtcNow; scriptItem.CreatorID = agent.ID; scriptItem.Description = String.Empty; scriptItem.ID = UUID.Random(); scriptItem.Name = "New script"; scriptItem.OwnerID = agent.ID; scriptItem.ParentID = rez.InventoryBlock.FolderID; scriptItem.ParentObjectID = targetPrim.ID; scriptItem.Permissions = GetDefaultPermissions(); scriptItem.SalePrice = 10; scriptItem.SaleType = SaleType.Not; targetPrim.Inventory.AddOrUpdateItem(scriptItem, false); m_log.Info(agent.Name + " created new task inventory script: " + scriptItem.Name); // Run the script if (m_scriptEngine != null) m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0); else m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine"); SignalTaskInventoryChange(agent, targetPrim); } } else { m_log.Warn(agent.Name + "sent a RezScript packet referencing unknown object " + rez.UpdateBlock.ObjectLocalID); } }
private void RezScriptHandler(Packet packet, LLAgent agent) { RezScriptPacket rez = (RezScriptPacket)packet; LLInventoryTaskItem scriptItem; ISceneEntity targetObj; if (m_scene.TryGetEntity(rez.UpdateBlock.ObjectLocalID, out targetObj) && targetObj is LLPrimitive) { LLPrimitive targetPrim = (LLPrimitive)targetObj; if (rez.InventoryBlock.ItemID != UUID.Zero) { if (targetPrim.Inventory.TryGetItem(rez.InventoryBlock.ItemID, out scriptItem)) { // Rezzing a script from task inventory UUID assetID = UUID.Combine(rez.InventoryBlock.TransactionID, agent.SecureSessionID); // Update task inventory with the new script source assetID scriptItem.AssetID = assetID; targetPrim.Inventory.AddOrUpdateItem(scriptItem, true); // Run the script if (m_scriptEngine != null) { m_scriptEngine.RezScript(scriptItem.ID, assetID, targetObj, 0); } else { m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine"); } SignalTaskInventoryChange(agent, targetPrim); } else if (m_inventory != null) { InventoryBase obj; if (m_inventory.TryGetInventory(agent.ID, rez.InventoryBlock.ItemID, out obj) && obj is InventoryItem && ((InventoryItem)obj).ContentType == "application/vnd.ll.lsltext") { LLInventoryItem sourceItem = new LLInventoryItem((InventoryItem)obj); // Rezzing a script from agent inventory scriptItem = new LLInventoryTaskItem(); scriptItem.AssetID = sourceItem.AssetID; scriptItem.ContentType = "application/vnd.ll.lsltext"; scriptItem.CreationDate = DateTime.UtcNow; scriptItem.CreatorID = agent.ID; scriptItem.Description = sourceItem.Description; scriptItem.ID = UUID.Random(); scriptItem.Name = sourceItem.Name; scriptItem.OwnerID = sourceItem.OwnerID; scriptItem.ParentID = sourceItem.ParentID; scriptItem.ParentObjectID = targetPrim.ID; scriptItem.Flags = sourceItem.Flags; scriptItem.GroupID = sourceItem.GroupID; scriptItem.GroupOwned = sourceItem.GroupOwned; scriptItem.Permissions = sourceItem.Permissions; scriptItem.SalePrice = sourceItem.SalePrice; scriptItem.SaleType = sourceItem.SaleType; targetPrim.Inventory.AddOrUpdateItem(scriptItem, false); m_log.Info(agent.Name + " copied agent inventory script to task inventory: " + scriptItem.Name); // Run the script if (m_scriptEngine != null) { m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0); } else { m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine"); } SignalTaskInventoryChange(agent, targetPrim); } else { m_log.Warn(agent.Name + " called RezScript for unknown inventory script " + rez.InventoryBlock.ItemID); } } else { m_log.Warn(agent.Name + "attempted to copy (and rez) script " + rez.InventoryBlock.ItemID + " to task inventory, but we have no IInventoryClient"); } } else { // Rezzing a new script scriptItem = new LLInventoryTaskItem(); scriptItem.AssetID = DEFAULT_SCRIPT; scriptItem.ContentType = "application/vnd.ll.lsltext"; scriptItem.CreationDate = DateTime.UtcNow; scriptItem.CreatorID = agent.ID; scriptItem.Description = String.Empty; scriptItem.ID = UUID.Random(); scriptItem.Name = "New script"; scriptItem.OwnerID = agent.ID; scriptItem.ParentID = rez.InventoryBlock.FolderID; scriptItem.ParentObjectID = targetPrim.ID; scriptItem.Permissions = GetDefaultPermissions(); scriptItem.SalePrice = 10; scriptItem.SaleType = SaleType.Not; targetPrim.Inventory.AddOrUpdateItem(scriptItem, false); m_log.Info(agent.Name + " created new task inventory script: " + scriptItem.Name); // Run the script if (m_scriptEngine != null) { m_scriptEngine.RezScript(scriptItem.ID, scriptItem.AssetID, targetObj, 0); } else { m_log.Warn("Can't rez script in prim " + targetObj.ID + " without an ILSLScriptEngine"); } SignalTaskInventoryChange(agent, targetPrim); } } else { m_log.Warn(agent.Name + "sent a RezScript packet referencing unknown object " + rez.UpdateBlock.ObjectLocalID); } }
private void UpdateTaskInventoryHandler(Packet packet, LLAgent agent) { UpdateTaskInventoryPacket update = (UpdateTaskInventoryPacket)packet; LLInventoryTaskItem item; ISceneEntity targetObj; if (update.UpdateData.Key != 0) { m_log.Warn("Got an UpdateTaskInventory packet with a Key of " + update.UpdateData.Key); return; } if (m_scene.TryGetEntity(update.UpdateData.LocalID, out targetObj) && targetObj is LLPrimitive) { LLPrimitive targetPrim = (LLPrimitive)targetObj; // Updating an existing item in the task inventory if (targetPrim.Inventory.TryGetItem(update.InventoryData.ItemID, out item)) { if (update.InventoryData.TransactionID != UUID.Zero) { item.AssetID = UUID.Combine(update.InventoryData.TransactionID, agent.SecureSessionID); } item.Description = Utils.BytesToString(update.InventoryData.Description); item.Flags = update.InventoryData.Flags; item.GroupID = update.InventoryData.GroupID; item.GroupOwned = update.InventoryData.GroupOwned; item.Name = Utils.BytesToString(update.InventoryData.Name); item.Permissions = new Permissions(update.InventoryData.BaseMask, update.InventoryData.EveryoneMask, update.InventoryData.GroupMask, update.InventoryData.NextOwnerMask, update.InventoryData.OwnerMask); item.SalePrice = update.InventoryData.SalePrice; item.SaleType = (SaleType)update.InventoryData.SaleType; targetPrim.Inventory.AddOrUpdateItem(item, true); m_log.Debug(agent.Name + " updated task inventory item: " + item.Name); SignalTaskInventoryChange(agent, targetPrim); } else if (m_inventory != null) { // Copying from agent inventory to task inventory InventoryBase obj; if (m_inventory.TryGetInventory(agent.ID, update.InventoryData.ItemID, out obj)) { if (obj is InventoryItem) { // Create a new item in the task inventory LLInventoryItem fromItem = new LLInventoryItem((InventoryItem)obj); item = new LLInventoryTaskItem(); //item.ID will be assigned in AddOrUpdateItem item.AssetID = fromItem.AssetID; item.ContentType = fromItem.ContentType; item.CreationDate = fromItem.CreationDate; item.CreatorID = fromItem.CreatorID; item.Description = fromItem.Description; item.Flags = fromItem.ExtraData["Flags"].AsUInteger(); item.GrantedPermissions = 0; item.GroupID = fromItem.ExtraData["group_id"].AsUUID(); item.GroupOwned = fromItem.ExtraData["group_owned"].AsBoolean(); item.Name = fromItem.Name; item.OwnerID = agent.ID; item.ParentID = update.InventoryData.FolderID; item.ParentObjectID = targetPrim.ID; item.PermissionGranter = UUID.Zero; item.Permissions = fromItem.Permissions; item.SalePrice = fromItem.ExtraData["sale_price"].AsInteger(); item.SaleType = (SaleType)fromItem.ExtraData["sale_type"].AsInteger(); targetPrim.Inventory.AddOrUpdateItem(item, false); m_log.Debug(agent.Name + " created new task inventory item: " + item.Name); SignalTaskInventoryChange(agent, targetPrim); } else { m_log.Error("[TODO] Handle dropping folders in task inventory"); } } else { m_log.Warn(agent.Name + " sent an UpdateTaskInventory packet requesting unknown " + "(or failed to fetch) inventory item " + update.InventoryData.ItemID); } } else { m_log.Warn(agent.Name + "attempted to copy inventory item " + update.InventoryData.ItemID + " to task inventory, but we have no IInventoryClient"); } } else { m_log.Warn(agent.Name + " attempted to update task inventory for prim " + update.UpdateData.LocalID + " that does not exist in this scene"); } }
private void RezObject(IScriptInstance script, string inventory, Vector3 position, Vector3 vel, Quaternion rot, int param, bool atRoot) { // TODO: Test to make sure this actually rezzes from the root, and get the atRoot param working // Can't do this without an IAssetClient if (m_assetClient == null) { return; } // Sanity check the input rotation if (Single.IsNaN(rot.X) || Single.IsNaN(rot.Y) || Single.IsNaN(rot.Z) || Single.IsNaN(rot.W)) { return; } // Sanity check the distance, silently fail at > 10m float dist = Vector3.Distance(script.Host.ScenePosition, position); if (dist > 10.0f) { return; } if (script.Host is LLPrimitive) { LLPrimitive obj = (LLPrimitive)script.Host; LLInventoryTaskItem item = obj.Inventory.FindItem(delegate(LLInventoryTaskItem match) { return(match.Name == inventory); }); if (item != null) { // Make sure this is an object if (item.InventoryType != InventoryType.Object) { llSay(script, 0, "Unable to create requested object. Object is missing from database."); return; } // Fetch the serialized linkset asset Asset linksetAsset; if (!m_assetClient.TryGetAsset(item.AssetID, LLUtil.LLAssetTypeToContentType((int)AssetType.Object), out linksetAsset)) { llSay(script, 0, "Unable to create requested object. Object is missing from database."); return; } // Deserialize the asset to LLSD OSDMap linksetMap = null; try { linksetMap = OSDParser.Deserialize(linksetAsset.Data) as OSDMap; } catch (Exception ex) { m_log.Error("Failed to deserialize linkset from asset " + linksetAsset.ID + ": " + ex.Message); } if (linksetMap == null) { llSay(script, 0, "Unable to create requested object. Object is corrupted in database."); return; } // Deserialize the linkset IList <LLPrimitive> linkset = LLPrimitive.DeserializeLinkset(linksetMap, obj.Scene, m_primMesher, true); Vector3 velocity = vel; Quaternion rotation = rot; float velMag = velocity.Length(); float mass = (float)llGetMass(script); // Rez the parent(s) first for (int i = 0; i < linkset.Count; i++) { LLPrimitive prim = linkset[i]; if (prim.Parent == null) { // Objects rezzed with this method are DieAtEdge by default prim.Prim.Flags |= PrimFlags.DieAtEdge; // Set the position, rotation and velocity of the root prim in the scene prim.RelativePosition = position; prim.RelativeRotation = rotation; if (prim.Prim.Flags.HasFlag(PrimFlags.Physics)) { prim.FallStart = Util.TickCount(); prim.Velocity = velocity; } obj.Scene.EntityAddOrUpdate(this, prim, UpdateFlags.FullUpdate, 0); m_log.Debug("Deserialized root prim " + prim.ID + " (" + prim.LocalID + ") from task inventory"); } } // Rez the children for (int i = 0; i < linkset.Count; i++) { LLPrimitive prim = linkset[i]; if (prim.Parent != null) { obj.Scene.EntityAddOrUpdate(this, prim, UpdateFlags.FullUpdate, 0); } } // FIXME: Post an object_rez event if (obj.Prim.Flags.HasFlag(PrimFlags.Physics)) { obj.FallStart = Util.TickCount(); // FIXME: Recoil //llApplyImpulse(script, new lsl_vector(velocity.X * mass, velocity.Y * mass, velocity.Z * mass), 0); } // Variable script delay (http://wiki.secondlife.com/wiki/LSL_Delay) script.AddSleepMS((int)((mass * velMag) * 0.1f)); script.AddSleepMS(200); } else { llSay(script, 0, "Could not find object " + inventory); } } }