private static PrimFlags LSLEventFlagsToPrimFlags(LSLEventFlags eventFlags, out bool hasCollisionEvents) { PrimFlags flags = PrimFlags.None; if (eventFlags.HasFlag(LSLEventFlags.touch) || eventFlags.HasFlag(LSLEventFlags.touch_start) || eventFlags.HasFlag(LSLEventFlags.touch_end)) { flags |= PrimFlags.Touch; } if (eventFlags.HasFlag(LSLEventFlags.money)) { flags |= PrimFlags.Money; } if (eventFlags.HasFlag(LSLEventFlags.collision) || eventFlags.HasFlag(LSLEventFlags.collision_start) || eventFlags.HasFlag(LSLEventFlags.collision_end) || eventFlags.HasFlag(LSLEventFlags.land_collision) || eventFlags.HasFlag(LSLEventFlags.land_collision_start) || eventFlags.HasFlag(LSLEventFlags.land_collision_end)) { hasCollisionEvents = true; } else { hasCollisionEvents = false; } return(flags); }
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); } }
/// <summary> /// Finds all of the LSL event handlers this script registers in a /// given state /// </summary> /// <param name="state">State to search for event handlers</param> /// <returns>A bitmask containing the types of events this state has /// handlers for</returns> public LSLEventFlags GetEventsForState(string state) { Type scriptType = m_script.GetType(); LSLEventFlags eventFlags = 0; foreach (LSLEventFlags flag in Enum.GetValues(typeof(LSLEventFlags))) { string eventName = state + "_event_" + flag; try { MethodInfo method = scriptType.GetMethod(eventName); if (method != null) { eventFlags |= flag; } } catch (Exception) { } } return(eventFlags); }
public static bool HasFlag(this LSLEventFlags eventFlags, LSLEventFlags flag) { return (eventFlags & flag) == flag; }
public static bool HasFlag(this LSLEventFlags eventFlags, LSLEventFlags flag) { return((eventFlags & flag) == flag); }
private void StartScript(UUID sourceItemID, UUID sourceAssetID, ISceneEntity hostObject, byte[] scriptBinary) { // Create a new AppDomain for this script AppDomainSetup domainSetup = new AppDomainSetup(); domainSetup.LoaderOptimization = LoaderOptimization.SingleDomain; AppDomain scriptDomain = AppDomain.CreateDomain(sourceItemID + ".lsl", null, domainSetup); // Create an instance (that lives in this AppDomain) and a wrapper // (that lives in the script AppDomain) for this script LSLScriptInstance instance = new LSLScriptInstance(sourceItemID, sourceAssetID, hostObject, scriptDomain); LSLScriptWrapper wrapper = (LSLScriptWrapper)scriptDomain.CreateInstanceAndUnwrap( Assembly.GetExecutingAssembly().FullName, "Simian.Scripting.Linden.LSLScriptWrapper"); wrapper.Init(scriptBinary, instance); instance.Init(wrapper); lock (m_syncRoot) { // If this script is already running, shut it down StopScript(sourceItemID, false); // Keep track of this script m_scripts[sourceItemID] = instance; // Keep track of the entity containing this script Dictionary <UUID, LSLScriptInstance> entityScripts; if (!m_scriptedEntities.TryGetValue(hostObject.ID, out entityScripts)) { entityScripts = new Dictionary <UUID, LSLScriptInstance>(); m_scriptedEntities[hostObject.ID] = entityScripts; } entityScripts[instance.ID] = instance; } if (hostObject is LLPrimitive) { // Update the PrimFlags for the containing LLPrimitive LLPrimitive obj = (LLPrimitive)hostObject; bool hasCollisionEvents; PrimFlags oldFlags = obj.Prim.Flags; LSLEventFlags eventFlags = wrapper.GetEventsForState("default"); PrimFlags newFlags = oldFlags; newFlags &= ~(PrimFlags.Touch | PrimFlags.Money); newFlags |= PrimFlags.Scripted | LSLEventFlagsToPrimFlags(eventFlags, out hasCollisionEvents); // FIXME: Do something with hasCollisionEvents // Either update the PrimFlags for this prim or just schedule // it for serialization (since it has a new script) if (newFlags != oldFlags) { obj.Prim.Flags = newFlags; m_scene.EntityAddOrUpdate(this, obj, 0, (uint)LLUpdateFlags.PrimFlags); } else { m_scene.EntityAddOrUpdate(this, obj, UpdateFlags.Serialize, 0); } } // Fire the state_entry event to get this script started PostScriptEvent(new EventParams(sourceItemID, "state_entry", new object[0], new DetectParams[0])); }