Exemple #1
0
        public void ApiResetScript()
        {
            // bool running = Running;

            RemoveState();
            ReleaseControls();

            m_Script.ResetVars();
            Part.Inventory.GetInventoryItem(ItemID).PermsMask    = 0;
            Part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
            AsyncCommandManager.UnregisterScriptFacilities(Engine, LocalID, ItemID, true);

            EventQueue.Clear();
            m_Script.ResetVars();
            string oldState = State;

            StartParam = 0;
            State      = "default";

            Part.SetScriptEvents(ItemID,
                                 (int)m_Script.GetStateEventFlags(State));

            if (m_CurrentEvent != "state_entry" || oldState != "default")
            {
                m_SaveState = true;
                PostEvent(new EventParams("state_entry",
                                          new Object[0], new DetectParams[0]));
                throw new EventAbortException();
            }
        }
Exemple #2
0
        public void ResetScript(int timeout)
        {
            if (m_Script == null)
            {
                return;
            }

            bool running = Running;

            RemoveState();
            ReleaseControls();

            Stop(timeout);
            Part.Inventory.GetInventoryItem(ItemID).PermsMask    = 0;
            Part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
            AsyncCommandManager.UnregisterScriptFacilities(Engine, LocalID, ItemID, true);
            EventQueue.Clear();
            m_Script.ResetVars();
            StartParam = 0;
            State      = "default";

            Part.SetScriptEvents(ItemID,
                                 (int)m_Script.GetStateEventFlags(State));
            if (running)
            {
                Start();
            }
            m_SaveState = true;
            PostEvent(new EventParams("state_entry",
                                      new Object[0], new DetectParams[0]));
        }
Exemple #3
0
        /// <summary>
        /// Process the next event queued for this script
        /// </summary>
        /// <returns></returns>
        public object EventProcessor()
        {
            // We check here as the thread stopping this instance from running may itself hold the m_Script lock.
            if (!Running)
            {
                return(0);
            }

            lock (m_Script)
            {
//                m_log.DebugFormat("[XEngine]: EventProcessor() invoked for {0}.{1}", PrimName, ScriptName);

                if (Suspended)
                {
                    return(0);
                }

                EventParams data = null;

                lock (EventQueue)
                {
                    data = (EventParams)EventQueue.Dequeue();
                    if (data == null) // Shouldn't happen
                    {
                        if (EventQueue.Count > 0 && Running && !ShuttingDown)
                        {
                            m_CurrentWorkItem = Engine.QueueEventHandler(this);
                        }
                        else
                        {
                            m_CurrentWorkItem = null;
                        }
                        return(0);
                    }

                    if (data.EventName == "timer")
                    {
                        m_TimerQueued = false;
                    }
                    if (data.EventName == "control")
                    {
                        if (m_ControlEventsInQueue > 0)
                        {
                            m_ControlEventsInQueue--;
                        }
                    }
                    if (data.EventName == "collision")
                    {
                        m_CollisionInQueue = false;
                    }
                }

                if (DebugLevel >= 2)
                {
                    m_log.DebugFormat(
                        "[SCRIPT INSTANCE]: Processing event {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}",
                        data.EventName,
                        ScriptName,
                        Part.Name,
                        Part.LocalId,
                        Part.ParentGroup.Name,
                        Part.ParentGroup.UUID,
                        Part.AbsolutePosition,
                        Part.ParentGroup.Scene.Name);
                }

                m_DetectParams = data.DetectParams;

                if (data.EventName == "state") // Hardcoded state change
                {
                    State = data.Params[0].ToString();

                    if (DebugLevel >= 1)
                    {
                        m_log.DebugFormat(
                            "[SCRIPT INSTANCE]: Changing state to {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}",
                            State,
                            ScriptName,
                            Part.Name,
                            Part.LocalId,
                            Part.ParentGroup.Name,
                            Part.ParentGroup.UUID,
                            Part.AbsolutePosition,
                            Part.ParentGroup.Scene.Name);
                    }

                    AsyncCommandManager.UnregisterScriptFacilities(Engine,
                                                                   LocalID, ItemID, false);

                    Part.SetScriptEvents(ItemID, (int)m_Script.GetStateEventFlags(State));
                }
                else
                {
                    if (Engine.World.PipeEventsForScript(LocalID) ||
                        data.EventName == "control") // Don't freeze avies!
                    {
                        //                m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
                        //                        PrimName, ScriptName, data.EventName, State);

                        try
                        {
                            m_CurrentEvent = data.EventName;
                            m_EventStart   = DateTime.Now;
                            m_InEvent      = true;

                            int start = Environment.TickCount;

                            // Reset the measurement period when we reach the end of the current one.
                            if (start - MeasurementPeriodTickStart > MaxMeasurementPeriod)
                            {
                                MeasurementPeriodTickStart = start;
                            }

                            m_Script.ExecuteEvent(State, data.EventName, data.Params);

                            MeasurementPeriodExecutionTime += Environment.TickCount - start;

                            m_InEvent      = false;
                            m_CurrentEvent = String.Empty;

                            if (m_SaveState)
                            {
                                // This will be the very first event we deliver
                                // (state_entry) in default state
                                //
                                SaveState(m_Assembly);

                                m_SaveState = false;
                            }
                        }
                        catch (Exception e)
                        {
//                            m_log.DebugFormat(
//                                "[SCRIPT] Exception in script {0} {1}: {2}{3}",
//                                ScriptName, ItemID, e.Message, e.StackTrace);

                            m_InEvent      = false;
                            m_CurrentEvent = String.Empty;

                            if ((!(e is TargetInvocationException) ||
                                 (!(e.InnerException is SelfDeleteException) &&
                                  !(e.InnerException is ScriptDeleteException) &&
                                  !(e.InnerException is ScriptCoopStopException))) &&
                                !(e is ThreadAbortException))
                            {
                                try
                                {
                                    // DISPLAY ERROR INWORLD
                                    string text = FormatException(e);

                                    text = "At region id " + m_RegionID + ":\n" + text;
                                    if (text.Length > 1000)
                                    {
                                        text = text.Substring(0, 1000);
                                    }
                                    Engine.World.SimChat(Utils.StringToBytes(text),
                                                         ChatTypeEnum.DebugChannel, 2147483647,
                                                         Part.AbsolutePosition,
                                                         Part.Name, Part.UUID, false);


                                    m_log.Debug(string.Format(
                                                    "[SCRIPT INSTANCE]: Runtime error in script {0}, part {1} {2} at {3} in {4} ",
                                                    ScriptName,
                                                    PrimName,
                                                    Part.UUID,
                                                    Part.AbsolutePosition,
                                                    Part.ParentGroup.Scene.Name),
                                                e);
                                }
                                catch (Exception)
                                {
                                }
                                // catch (Exception e2) // LEGIT: User Scripting
                                // {
                                // m_log.Error("[SCRIPT]: "+
                                //           "Error displaying error in-world: " +
                                //         e2.ToString());
                                //    m_log.Error("[SCRIPT]: " +
                                //              "Errormessage: Error compiling script:\r\n" +
                                //            e.ToString());
                                // }
                            }
                            else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
                            {
                                m_InSelfDelete = true;
                                Engine.World.DeleteSceneObject(Part.ParentGroup, false);
                            }
                            else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException))
                            {
                                m_InSelfDelete = true;
                                Part.Inventory.RemoveInventoryItem(ItemID);
                            }
                            else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException))
                            {
                                if (DebugLevel >= 1)
                                {
                                    m_log.DebugFormat(
                                        "[SCRIPT INSTANCE]: Script {0}.{1} in event {2}, state {3} stopped co-operatively.",
                                        PrimName, ScriptName, data.EventName, State);
                                }
                            }
                        }
                    }
                }

                // If there are more events and we are currently running and not shutting down, then ask the
                // script engine to run the next event.
                lock (EventQueue)
                {
                    EventsProcessed++;

                    if (EventQueue.Count > 0 && Running && !ShuttingDown)
                    {
                        m_CurrentWorkItem = Engine.QueueEventHandler(this);
                    }
                    else
                    {
                        m_CurrentWorkItem = null;
                    }
                }

                m_DetectParams = null;

                return(0);
            }
        }
Exemple #4
0
 public void DestroyScriptInstance()
 {
     ReleaseControls();
     AsyncCommandManager.UnregisterScriptFacilities(Engine, LocalID, ItemID, true);
 }