/**
         * @brief The script called llResetScript() while it was running and
         *        has suspended.  We want to reset the script to a never-has-
         *        ever-run-before state.
         *
         *        Caller must have m_RunLock locked so we know script isn't
         *        running.
         */
        private void ResetLocked(string from)
        {
            m_RunOnePhase = "ResetLocked: releasing controls";
            ReleaseControlsOrPermissions(true);
            m_Part.CollisionSound = UUID.Zero;

            if (m_XMRLSLApi != null)
            {
                m_XMRLSLApi.llResetTime();
            }

            m_RunOnePhase = "ResetLocked: removing script";
            IUrlModule urlModule = m_Engine.World.RequestModuleInterface <IUrlModule>();

            if (urlModule != null)
            {
                urlModule.ScriptRemoved(m_ItemID);
            }

            AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);

            m_RunOnePhase  = "ResetLocked: clearing current event";
            this.eventCode = ScriptEventCode.None; // not processing an event
            m_DetectParams = null;                 // not processing an event
            m_SleepUntil   = DateTime.MinValue;    // not doing llSleep()
            m_ResetCount++;                        // has been reset once more

            m_localsHeapUsed = 0;
            m_arraysHeapUsed = 0;
            glblVars.Clear();

            // Tell next call to 'default state_entry()' to reset all global
            // vars to their initial values.
            doGblInit = true;

            // Throw away all its stack frames.
            // If the script is resetting itself, there shouldn't be any stack frames.
            // If the script is being reset by something else, we throw them away cuz we want to start from the beginning of an event handler.
            stackFrames = null;

            // Set script to 'default' state and queue call to its
            // 'state_entry()' event handler.
            m_RunOnePhase = "ResetLocked: posting default:state_entry() event";
            stateCode     = 0;
            m_Part.RemoveScriptTargets(m_ItemID);
            m_Part.SetScriptEvents(m_ItemID, GetStateEventFlags(0));
            PostEvent(new EventParams("state_entry",
                                      zeroObjectArray,
                                      zeroDetectParams));

            // Tell CheckRun() to let script run.
            suspendOnCheckRunHold = false;
            suspendOnCheckRunTemp = false;
            m_RunOnePhase         = "ResetLocked: reset complete";
        }
Beispiel #2
0
        /**
         * @brief The script called llResetScript() while it was running and
         *        has suspended.  We want to reset the script to a never-has-
         *        ever-run-before state.
         *
         *        Caller must have m_RunLock locked so we know script isn't
         *        running.
         */
        private void ResetLocked(string from)
        {
            m_RunOnePhase = "ResetLocked: releasing controls";
            ReleaseControls();

            m_RunOnePhase = "ResetLocked: removing script";
            m_Part.Inventory.GetInventoryItem(m_ItemID).PermsMask    = 0;
            m_Part.Inventory.GetInventoryItem(m_ItemID).PermsGranter = UUID.Zero;
            IUrlModule urlModule = m_Engine.World.RequestModuleInterface <IUrlModule>();

            if (urlModule != null)
            {
                urlModule.ScriptRemoved(m_ItemID);
            }

            AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);

            m_RunOnePhase  = "ResetLocked: clearing current event";
            this.eventCode = ScriptEventCode.None;  // not processing an event
            m_DetectParams = null;                  // not processing an event
            m_SleepUntil   = DateTime.MinValue;     // not doing llSleep()
            m_ResetCount++;                         // has been reset once more

            /*
             * Tell next call to 'default state_entry()' to reset all global
             * vars to their initial values.
             */
            doGblInit = true;

            /*
             * Throw away all its stack frames.
             * If the script is resetting itself, there shouldn't be any stack frames.
             * If the script is being reset by something else, we throw them away cuz we want to start from the beginning of an event handler.
             */
            stackFrames = null;

            /*
             * Set script to 'default' state and queue call to its
             * 'state_entry()' event handler.
             */
            m_RunOnePhase = "ResetLocked: posting default:state_entry() event";
            stateCode     = 0;
            m_Part.SetScriptEvents(m_ItemID, GetStateEventFlags(0));
            PostEvent(new EventParams("state_entry",
                                      zeroObjectArray,
                                      zeroDetectParams));

            /*
             * Tell CheckRun() to let script run.
             */
            suspendOnCheckRunHold = false;
            suspendOnCheckRunTemp = false;
            m_RunOnePhase         = "ResetLocked: reset complete";
        }