Beispiel #1
0
        public InstanceData GetScript(uint localID, UUID itemID)
        {
            lock (scriptLock)
            {
                InstanceData id = null;

                if (Scripts.ContainsKey(localID) == false)
                {
                    return(null);
                }

                Dictionary <UUID, InstanceData> Obj;
                Scripts.TryGetValue(localID, out Obj);
                if (Obj == null)
                {
                    return(null);
                }
                if (Obj.ContainsKey(itemID) == false)
                {
                    return(null);
                }

                // Get script
                Obj.TryGetValue(itemID, out id);
                return(id);
            }
        }
Beispiel #2
0
        public DetectParams GetDetectParams(UUID itemID, int number)
        {
            uint localID = m_ScriptManager.GetLocalID(itemID);

            if (localID == 0)
            {
                return(null);
            }

            InstanceData id = m_ScriptManager.GetScript(localID, itemID);

            if (id == null)
            {
                return(null);
            }

            DetectParams[] det = m_ScriptManager.GetDetectParams(id);

            if (number < 0 || number >= det.Length)
            {
                return(null);
            }

            return(det[number]);
        }
Beispiel #3
0
        public void OnGetScriptRunning(IClientAPI controllingClient,
                                       UUID objectID, UUID itemID)
        {
            uint localID = m_ScriptManager.GetLocalID(itemID);

            if (localID == 0)
            {
                return;
            }

            InstanceData id = m_ScriptManager.GetScript(localID, itemID);

            if (id == null)
            {
                return;
            }

            IEventQueue eq = World.RequestModuleInterface <IEventQueue>();

            if (eq == null)
            {
                controllingClient.SendScriptRunningReply(objectID, itemID,
                                                         id.Running);
            }
            else
            {
                eq.Enqueue(EventQueueHelper.ScriptRunningReplyEvent(objectID, itemID, id.Running, true),
                           controllingClient.AgentId);
            }
        }
Beispiel #4
0
        public DetectParams[] GetDetectParams(InstanceData id)
        {
            if (detparms.ContainsKey(id))
            {
                return(detparms[id]);
            }

            return(null);
        }
Beispiel #5
0
        public void SetState(UUID itemID, string state)
        {
            uint localID = m_ScriptManager.GetLocalID(itemID);

            if (localID == 0)
            {
                return;
            }

            InstanceData id = m_ScriptManager.GetScript(localID, itemID);

            if (id == null)
            {
                return;
            }

            string currentState = id.State;

            if (currentState != state)
            {
                try
                {
                    m_EventManager.state_exit(localID);
                }
                catch (AppDomainUnloadedException)
                {
                    m_log.Error("[SCRIPT]: state change called when " +
                                "script was unloaded.  Nothing to worry about, " +
                                "but noting the occurance");
                }

                id.State = state;

                try
                {
                    int eventFlags = m_ScriptManager.GetStateEventFlags(localID,
                                                                        itemID);

                    SceneObjectPart part = m_Scene.GetSceneObjectPart(localID);
                    if (part != null)
                    {
                        part.SetScriptEvents(itemID, eventFlags);
                    }

                    m_EventManager.state_entry(localID);
                }
                catch (AppDomainUnloadedException)
                {
                    m_log.Error("[SCRIPT]: state change called when " +
                                "script was unloaded.  Nothing to worry about, but " +
                                "noting the occurance");
                }
            }
        }
Beispiel #6
0
        public void OnStopScript(uint localID, UUID itemID)
        {
            InstanceData id = m_ScriptManager.GetScript(localID, itemID);

            if (id == null)
            {
                return;
            }

            id.Running = false;
        }
Beispiel #7
0
        public int GetStartParameter(UUID itemID)
        {
            uint         localID = GetLocalID(itemID);
            InstanceData id      = GetScript(localID, itemID);

            if (id == null)
            {
                return(0);
            }

            return(id.StartParam);
        }
Beispiel #8
0
        public void ResetScript(uint localID, UUID itemID)
        {
            InstanceData id     = GetScript(localID, itemID);
            string       script = id.Source;

            StopScript(localID, itemID);
            SceneObjectPart part = World.GetSceneObjectPart(localID);

            part.Inventory.GetInventoryItem(itemID).PermsMask    = 0;
            part.Inventory.GetInventoryItem(itemID).PermsGranter = UUID.Zero;
            StartScript(localID, itemID, script, id.StartParam, false);
        }
Beispiel #9
0
        public void OnStartScript(uint localID, UUID itemID)
        {
            InstanceData id = m_ScriptManager.GetScript(localID, itemID);

            if (id == null)
            {
                return;
            }

            if (!id.Disabled)
            {
                id.Running = true;
            }
        }
Beispiel #10
0
        // Execute a LL-event-function in Script
        internal void ExecuteEvent(uint localID, UUID itemID,
                                   string FunctionName, DetectParams[] qParams, object[] args)
        {
            int          ExeStage = 0;  //        ;^) Ewe Loon, for debuging
            InstanceData id       = null;

            try                         //        ;^) Ewe Loon,fix
            {                           //        ;^) Ewe Loon,fix
                ExeStage = 1;           //        ;^) Ewe Loon, for debuging
                id       = GetScript(localID, itemID);
                if (id == null)
                {
                    return;
                }
                ExeStage = 2;           //        ;^) Ewe Loon, for debuging
                if (qParams.Length > 0) //        ;^) Ewe Loon,fix
                {
                    detparms[id] = qParams;
                }
                ExeStage = 3;           //        ;^) Ewe Loon, for debuging
                if (id.Running)
                {
                    id.Script.ExecuteEvent(id.State, FunctionName, args);
                }
                ExeStage = 4;           //        ;^) Ewe Loon, for debuging
                if (qParams.Length > 0) //        ;^) Ewe Loon,fix
                {
                    detparms.Remove(id);
                }
                ExeStage = 5;           //        ;^) Ewe Loon, for debuging
            }
            catch (Exception e)         //        ;^) Ewe Loon, From here down tis fix
            {
                if ((ExeStage == 3) && (qParams.Length > 0))
                {
                    detparms.Remove(id);
                }
                SceneObjectPart ob = m_scriptEngine.World.GetSceneObjectPart(localID);
                m_log.InfoFormat("[Script Error] ,{0},{1},@{2},{3},{4},{5}", ob.Name, FunctionName, ExeStage, e.Message, qParams.Length, detparms.Count);
                if (ExeStage != 2)
                {
                    throw e;
                }
            }
        }
Beispiel #11
0
        public IScriptApi GetApi(UUID itemID, string name)
        {
            uint localID = GetLocalID(itemID);

            InstanceData id = GetScript(localID, itemID);

            if (id == null)
            {
                return(null);
            }

            if (id.Apis.ContainsKey(name))
            {
                return(id.Apis[name]);
            }

            return(null);
        }
Beispiel #12
0
        public bool GetScriptState(UUID itemID)
        {
            uint localID = m_ScriptManager.GetLocalID(itemID);

            if (localID == 0)
            {
                return(false);
            }

            InstanceData id = m_ScriptManager.GetScript(localID, itemID);

            if (id == null)
            {
                return(false);
            }

            return(id.Running);
        }
Beispiel #13
0
        public int GetStateEventFlags(uint localID, UUID itemID)
        {
            try
            {
                InstanceData id = GetScript(localID, itemID);
                if (id == null)
                {
                    return(0);
                }
                int evflags = id.Script.GetStateEventFlags(id.State);

                return((int)evflags);
            }
            catch (Exception)
            {
            }

            return(0);
        }
Beispiel #14
0
        public void SetScriptState(UUID itemID, bool state)
        {
            uint localID = m_ScriptManager.GetLocalID(itemID);

            if (localID == 0)
            {
                return;
            }

            InstanceData id = m_ScriptManager.GetScript(localID, itemID);

            if (id == null)
            {
                return;
            }

            if (!id.Disabled)
            {
                id.Running = state;
            }
        }
Beispiel #15
0
        public void SetScript(uint localID, UUID itemID, InstanceData id)
        {
            lock (scriptLock)
            {
                // Create object if it doesn't exist
                if (Scripts.ContainsKey(localID) == false)
                {
                    Scripts.Add(localID, new Dictionary <UUID, InstanceData>());
                }

                // Delete script if it exists
                Dictionary <UUID, InstanceData> Obj;
                Scripts.TryGetValue(localID, out Obj);
                if (Obj.ContainsKey(itemID) == true)
                {
                    Obj.Remove(itemID);
                }

                // Add to object
                Obj.Add(itemID, id);
            }
        }
        /// <summary>
        /// Add event to event execution queue
        /// </summary>
        /// <param name="localID">Region object ID</param>
        /// <param name="itemID">Region script ID</param>
        /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param>
        /// <param name="param">Array of parameters to match event mask</param>
        public bool AddToScriptQueue(uint localID, UUID itemID, string FunctionName, DetectParams[] qParams, params object[] param)
        {
            List <UUID> keylist = m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID);

            if (!keylist.Contains(itemID)) // We don't manage that script
            {
                return(false);
            }

            lock (eventQueue)
            {
                if (eventQueue.Count >= EventExecutionMaxQueueSize)
                {
                    m_log.Error("[" + m_ScriptEngine.ScriptEngineName + "]: ERROR: Event execution queue item count is at " + eventQueue.Count + ". Config variable \"EventExecutionMaxQueueSize\" is set to " + EventExecutionMaxQueueSize + ", so ignoring new event.");
                    m_log.Error("[" + m_ScriptEngine.ScriptEngineName + "]: Event ignored: localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName);
                    return(false);
                }

                InstanceData id = m_ScriptEngine.m_ScriptManager.GetScript(
                    localID, itemID);

                // Create a structure and add data
                QueueItemStruct QIS = new QueueItemStruct();
                QIS.localID        = localID;
                QIS.itemID         = itemID;
                QIS.functionName   = FunctionName;
                QIS.llDetectParams = qParams;
                QIS.param          = param;
                if (id != null)
                {
                    QIS.LineMap = id.LineMap;
                }

                // Add it to queue
                eventQueue.Enqueue(QIS);
            }
            return(true);
        }
Beispiel #17
0
        public void _StopScript(uint localID, UUID itemID)
        {
            InstanceData id = GetScript(localID, itemID);

            if (id == null)
            {
                return;
            }

            m_log.DebugFormat("[{0}]: Unloading script",
                              m_scriptEngine.ScriptEngineName);

            // Stop long command on script
            AsyncCommandManager.RemoveScript(m_scriptEngine, localID, itemID);

            try
            {
                // Get AppDomain
                // Tell script not to accept new requests
                id.Running  = false;
                id.Disabled = true;
                AppDomain ad = id.AppDomain;

                // Remove from internal structure
                RemoveScript(localID, itemID);

                // Tell AppDomain that we have stopped script
                m_scriptEngine.m_AppDomainManager.StopScript(ad);
            }
            catch (Exception e) // LEGIT: User Scripting
            {
                m_log.Error("[" +
                            m_scriptEngine.ScriptEngineName +
                            "]: Exception stopping script localID: " +
                            localID + " LLUID: " + itemID.ToString() +
                            ": " + e.ToString());
            }
        }
Beispiel #18
0
        public void _StartScript(uint localID, UUID itemID, string Script,
                                 int startParam, bool postOnRez)
        {
            m_log.DebugFormat(
                "[{0}]: ScriptManager StartScript: localID: {1}, itemID: {2}",
                m_scriptEngine.ScriptEngineName, localID, itemID);

            // We will initialize and start the script.
            // It will be up to the script itself to hook up the correct events.
            string CompiledScriptFile = String.Empty;

            SceneObjectPart m_host = World.GetSceneObjectPart(localID);

            if (null == m_host)
            {
                m_log.ErrorFormat(
                    "[{0}]: Could not find scene object part corresponding " +
                    "to localID {1} to start script",
                    m_scriptEngine.ScriptEngineName, localID);

                return;
            }

            UUID assetID = UUID.Zero;
            TaskInventoryItem taskInventoryItem = new TaskInventoryItem();

            if (m_host.TaskInventory.TryGetValue(itemID, out taskInventoryItem))
            {
                assetID = taskInventoryItem.AssetID;
            }

            ScenePresence presence =
                World.GetScenePresence(taskInventoryItem.OwnerID);

            CultureInfo USCulture = new CultureInfo("en-US");

            Thread.CurrentThread.CurrentCulture = USCulture;

            try
            {
                // Compile (We assume LSL)
                CompiledScriptFile =
                    LSLCompiler.PerformScriptCompile(Script,
                                                     assetID.ToString());

                if (presence != null && (!postOnRez))
                {
                    presence.ControllingClient.SendAgentAlertMessage(
                        "Compile successful", false);
                }

                m_log.InfoFormat("[SCRIPT]: Compiled assetID {0}: {1}",
                                 assetID, CompiledScriptFile);

                InstanceData id = new InstanceData();

                IScript CompiledScript;
                CompiledScript =
                    m_scriptEngine.m_AppDomainManager.LoadScript(
                        CompiledScriptFile, out id.AppDomain);
                //Register the sponsor
//                ISponsor scriptSponsor = new ScriptSponsor();
//                ILease lease = (ILease)RemotingServices.GetLifetimeService(CompiledScript as MarshalByRefObject);
//                lease.Register(scriptSponsor);
//                id.ScriptSponsor = scriptSponsor;

                id.LineMap    = LSLCompiler.LineMap();
                id.Script     = CompiledScript;
                id.Source     = Script;
                id.StartParam = startParam;
                id.State      = "default";
                id.Running    = true;
                id.Disabled   = false;

                // Add it to our script memstruct
                m_scriptEngine.m_ScriptManager.SetScript(localID, itemID, id);

                id.Apis = new Dictionary <string, IScriptApi>();

                ApiManager am = new ApiManager();

                foreach (string api in am.GetApis())
                {
                    id.Apis[api] = am.CreateApi(api);
                    id.Apis[api].Initialize(m_scriptEngine, m_host,
                                            localID, itemID);
                }

                foreach (KeyValuePair <string, IScriptApi> kv in id.Apis)
                {
                    CompiledScript.InitApi(kv.Key, kv.Value);
                }

                // Fire the first start-event
                int eventFlags =
                    m_scriptEngine.m_ScriptManager.GetStateEventFlags(
                        localID, itemID);

                m_host.SetScriptEvents(itemID, eventFlags);

                m_scriptEngine.m_EventQueueManager.AddToScriptQueue(
                    localID, itemID, "state_entry", new DetectParams[0],
                    new object[] { });

                if (postOnRez)
                {
                    m_scriptEngine.m_EventQueueManager.AddToScriptQueue(
                        localID, itemID, "on_rez", new DetectParams[0],
                        new object[] { new LSL_Types.LSLInteger(startParam) });
                }

                string[] warnings = LSLCompiler.GetWarnings();

                if (warnings != null && warnings.Length != 0)
                {
                    if (presence != null && (!postOnRez))
                    {
                        presence.ControllingClient.SendAgentAlertMessage(
                            "Script saved with warnings, check debug window!",
                            false);
                    }

                    foreach (string warning in warnings)
                    {
                        try
                        {
                            // DISPLAY WARNING INWORLD
                            string text = "Warning:\n" + warning;
                            if (text.Length > 1100)
                            {
                                text = text.Substring(0, 1099);
                            }

                            World.SimChat(Utils.StringToBytes(text),
                                          ChatTypeEnum.DebugChannel, 2147483647,
                                          m_host.AbsolutePosition, m_host.Name, m_host.UUID,
                                          false);
                        }
                        catch (Exception e2) // LEGIT: User Scripting
                        {
                            m_log.Error("[" +
                                        m_scriptEngine.ScriptEngineName +
                                        "]: Error displaying warning in-world: " +
                                        e2.ToString());
                            m_log.Error("[" +
                                        m_scriptEngine.ScriptEngineName + "]: " +
                                        "Warning:\r\n" +
                                        warning);
                        }
                    }
                }
            }
            catch (Exception e) // LEGIT: User Scripting
            {
                if (presence != null && (!postOnRez))
                {
                    presence.ControllingClient.SendAgentAlertMessage(
                        "Script saved with errors, check debug window!",
                        false);
                }
                try
                {
                    // DISPLAY ERROR INWORLD
                    string text = "Error compiling script:\n" +
                                  e.Message.ToString();
                    if (text.Length > 1100)
                    {
                        text = text.Substring(0, 1099);
                    }

                    World.SimChat(Utils.StringToBytes(text),
                                  ChatTypeEnum.DebugChannel, 2147483647,
                                  m_host.AbsolutePosition, m_host.Name, m_host.UUID,
                                  false);
                }
                catch (Exception e2) // LEGIT: User Scripting
                {
                    m_log.Error("[" +
                                m_scriptEngine.ScriptEngineName +
                                "]: Error displaying error in-world: " +
                                e2.ToString());
                    m_log.Error("[" +
                                m_scriptEngine.ScriptEngineName + "]: " +
                                "Errormessage: Error compiling script:\r\n" +
                                e2.Message.ToString());
                }
            }
        }
Beispiel #19
0
        public DetectParams[] GetDetectParams(InstanceData id)
        {
            if (detparms.ContainsKey(id))
                return detparms[id];

            return null;
        }
Beispiel #20
0
        public void SetScript(uint localID, UUID itemID, InstanceData id)
        {
            lock (scriptLock)
            {
                // Create object if it doesn't exist
                if (Scripts.ContainsKey(localID) == false)
                {
                    Scripts.Add(localID, new Dictionary<UUID, InstanceData>());
                }

                // Delete script if it exists
                Dictionary<UUID, InstanceData> Obj;
                Scripts.TryGetValue(localID, out Obj);
                if (Obj.ContainsKey(itemID) == true)
                    Obj.Remove(itemID);

                // Add to object
                Obj.Add(itemID, id);
            }
        }
Beispiel #21
0
        public void _StartScript(uint localID, UUID itemID, string Script,
                int startParam, bool postOnRez)
        {
            m_log.DebugFormat(
                "[{0}]: ScriptManager StartScript: localID: {1}, itemID: {2}",
                m_scriptEngine.ScriptEngineName, localID, itemID);

            // We will initialize and start the script.
            // It will be up to the script itself to hook up the correct events.
            string CompiledScriptFile = String.Empty;

            SceneObjectPart m_host = World.GetSceneObjectPart(localID);

            if (null == m_host)
            {
                m_log.ErrorFormat(
                    "[{0}]: Could not find scene object part corresponding "+
                    "to localID {1} to start script",
                    m_scriptEngine.ScriptEngineName, localID);

                return;
            }

            UUID assetID = UUID.Zero;
            TaskInventoryItem taskInventoryItem = new TaskInventoryItem();
            if (m_host.TaskInventory.TryGetValue(itemID, out taskInventoryItem))
                assetID = taskInventoryItem.AssetID;

            ScenePresence presence =
                    World.GetScenePresence(taskInventoryItem.OwnerID);

            CultureInfo USCulture = new CultureInfo("en-US");
            Thread.CurrentThread.CurrentCulture = USCulture;

            try
            {
                // Compile (We assume LSL)
                CompiledScriptFile =
                        LSLCompiler.PerformScriptCompile(Script,
                        assetID.ToString(), taskInventoryItem.OwnerID);

                if (presence != null && (!postOnRez))
                    presence.ControllingClient.SendAgentAlertMessage(
                            "Compile successful", false);

                m_log.InfoFormat("[SCRIPT]: Compiled assetID {0}: {1}",
                        assetID, CompiledScriptFile);

                InstanceData id = new InstanceData();

                IScript CompiledScript;
                CompiledScript =
                        m_scriptEngine.m_AppDomainManager.LoadScript(
                        CompiledScriptFile, out id.AppDomain);
                //Register the sponsor
//                ISponsor scriptSponsor = new ScriptSponsor();
//                ILease lease = (ILease)RemotingServices.GetLifetimeService(CompiledScript as MarshalByRefObject);
//                lease.Register(scriptSponsor);
//                id.ScriptSponsor = scriptSponsor;

                id.LineMap = LSLCompiler.LineMap();
                id.Script = CompiledScript;
                id.Source = Script;
                id.StartParam = startParam;
                id.State = "default";
                id.Running = true;
                id.Disabled = false;

                // Add it to our script memstruct
                m_scriptEngine.m_ScriptManager.SetScript(localID, itemID, id);

                id.Apis = new Dictionary<string, IScriptApi>();

                ApiManager am = new ApiManager();

                foreach (string api in am.GetApis())
                {
                    id.Apis[api] = am.CreateApi(api);
                    id.Apis[api].Initialize(m_scriptEngine, m_host,
                            localID, itemID);
                }

                foreach (KeyValuePair<string,IScriptApi> kv in id.Apis)
                {
                    CompiledScript.InitApi(kv.Key, kv.Value);
                }

                // Fire the first start-event
                int eventFlags =
                        m_scriptEngine.m_ScriptManager.GetStateEventFlags(
                        localID, itemID);

                m_host.SetScriptEvents(itemID, eventFlags);

                m_scriptEngine.m_EventQueueManager.AddToScriptQueue(
                        localID, itemID, "state_entry", new DetectParams[0],
                        new object[] { });

                if (postOnRez)
                {
                    m_scriptEngine.m_EventQueueManager.AddToScriptQueue(
                        localID, itemID, "on_rez", new DetectParams[0],
                        new object[] { new LSL_Types.LSLInteger(startParam) });
                }

                string[] warnings = LSLCompiler.GetWarnings();

                if (warnings != null && warnings.Length != 0)
                {
                    if (presence != null && (!postOnRez))
                        presence.ControllingClient.SendAgentAlertMessage(
                                "Script saved with warnings, check debug window!",
                                false);

                    foreach (string warning in warnings)
                    {
                        try
                        {
                            // DISPLAY WARNING INWORLD
                            string text = "Warning:\n" + warning;
                            if (text.Length > 1100)
                                text = text.Substring(0, 1099);

                            World.SimChat(Utils.StringToBytes(text),
                                    ChatTypeEnum.DebugChannel, 2147483647,
                                    m_host.AbsolutePosition, m_host.Name, m_host.UUID,
                                    false);
                        }
                        catch (Exception e2) // LEGIT: User Scripting
                        {
                            m_log.Error("[" +
                                    m_scriptEngine.ScriptEngineName +
                                    "]: Error displaying warning in-world: " +
                                    e2.ToString());
                            m_log.Error("[" +
                                    m_scriptEngine.ScriptEngineName + "]: " +
                                    "Warning:\r\n" +
                                    warning);
                        }
                    }
                }
            }
            catch (Exception e) // LEGIT: User Scripting
            {
                if (presence != null && (!postOnRez))
                    presence.ControllingClient.SendAgentAlertMessage(
                            "Script saved with errors, check debug window!",
                            false);
                try
                {
                    // DISPLAY ERROR INWORLD
                    string text = "Error compiling script:\n" +
                            e.Message.ToString();
                    if (text.Length > 1100)
                        text = text.Substring(0, 1099);

                    World.SimChat(Utils.StringToBytes(text),
                            ChatTypeEnum.DebugChannel, 2147483647,
                            m_host.AbsolutePosition, m_host.Name, m_host.UUID,
                            false);
                }
                catch (Exception e2) // LEGIT: User Scripting
                {
                    m_log.Error("[" +
                                m_scriptEngine.ScriptEngineName +
                                "]: Error displaying error in-world: " +
                                e2.ToString());
                    m_log.Error("[" +
                                m_scriptEngine.ScriptEngineName + "]: " +
                                "Errormessage: Error compiling script:\r\n" + 
                                e2.Message.ToString());
                }
            }
        }