コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
ファイル: LSLScriptInstance.cs プロジェクト: jhurliman/simian
        /// <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);
        }
コード例 #4
0
ファイル: ILSLEngine.cs プロジェクト: osgrid/openmetaverse
 public static bool HasFlag(this LSLEventFlags eventFlags, LSLEventFlags flag)
 {
     return (eventFlags & flag) == flag;
 }
コード例 #5
0
ファイル: ILSLEngine.cs プロジェクト: jhurliman/simian
 public static bool HasFlag(this LSLEventFlags eventFlags, LSLEventFlags flag)
 {
     return((eventFlags & flag) == flag);
 }
コード例 #6
0
        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]));
        }