public SensorRepeat(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; maximumRange = CmdManager.m_ScriptEngine.Config.GetDouble("SensorMaxRange", 96.0d); maximumToReturn = CmdManager.m_ScriptEngine.Config.GetInt("SensorMaxResults", 16); m_npcModule = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<INPCModule>(); }
public Listener(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; m_commsPlugin = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); }
public Timer(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; }
public Timer(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; }
/********************************************************************************\ * The only method of interest to outside this module is GetExecutionState() * * which captures the current state of the script into an XML document. * * * * The rest of this module contains support routines for GetExecutionState(). * \********************************************************************************/ /** * @brief Create an XML element that gives the current state of the script. * <ScriptState Engine="YEngine" SourceHash=m_ObjCode.sourceHash Asset=m_Item.AssetID> * <Snapshot>globalsandstackdump</Snapshot> * <Running>m_Running</Running> * <DetectArray ... * <EventQueue ... * <Permissions ... * <Plugins /> * </ScriptState> * Updates the .state file while we're at it. */ public XmlElement GetExecutionState(XmlDocument doc) { // When we're detaching an attachment, we need to wait here. // Change this to a 5 second timeout. If things do mess up, // we don't want to be stuck forever. // m_DetachReady.WaitOne(5000, false); XmlElement scriptStateN = doc.CreateElement("", "ScriptState", ""); scriptStateN.SetAttribute("Engine", m_Engine.ScriptEngineName); scriptStateN.SetAttribute("Asset", m_Item.AssetID.ToString()); scriptStateN.SetAttribute("SourceHash", m_ObjCode.sourceHash); // Make sure we aren't executing part of the script so it stays // stable. Setting suspendOnCheckRun tells CheckRun() to suspend // and return out so RunOne() will release the lock asap. suspendOnCheckRunHold = true; lock (m_RunLock) { m_RunOnePhase = "GetExecutionState enter"; CheckRunLockInvariants(true); // Get copy of script globals and stack in relocateable form. Byte[] snapshotBytes; using (MemoryStream snapshotStream = new MemoryStream()) { MigrateOutEventHandler(snapshotStream); snapshotBytes = snapshotStream.ToArray(); } string snapshotString = Convert.ToBase64String(snapshotBytes); XmlElement snapshotN = doc.CreateElement("", "Snapshot", ""); snapshotN.AppendChild(doc.CreateTextNode(snapshotString)); scriptStateN.AppendChild(snapshotN); m_RunOnePhase = "GetExecutionState B"; CheckRunLockInvariants(true); // "Running" says whether or not we are accepting new events. XmlElement runningN = doc.CreateElement("", "Running", ""); runningN.AppendChild(doc.CreateTextNode(m_Running.ToString())); scriptStateN.AppendChild(runningN); m_RunOnePhase = "GetExecutionState C"; CheckRunLockInvariants(true); // "DoGblInit" says whether or not default:state_entry() will init global vars. XmlElement doGblInitN = doc.CreateElement("", "DoGblInit", ""); doGblInitN.AppendChild(doc.CreateTextNode(doGblInit.ToString())); scriptStateN.AppendChild(doGblInitN); m_RunOnePhase = "GetExecutionState D"; CheckRunLockInvariants(true); if (m_XMRLSLApi != null) { double scriptTime = Util.GetTimeStampMS() - m_XMRLSLApi.getLSLTimer(); XmlElement scriptTimeN = doc.CreateElement("", "scrpTime", ""); scriptTimeN.AppendChild(doc.CreateTextNode(scriptTime.ToString())); scriptStateN.AppendChild(scriptTimeN); } if (m_minEventDelay != 0.0) { XmlElement minEventDelayN = doc.CreateElement("", "mEvtDly", ""); minEventDelayN.AppendChild(doc.CreateTextNode(m_minEventDelay.ToString())); scriptStateN.AppendChild(minEventDelayN); m_RunOnePhase = "GetExecutionState D"; CheckRunLockInvariants(true); } // More misc data. XmlNode permissionsN = doc.CreateElement("", "Permissions", ""); scriptStateN.AppendChild(permissionsN); XmlAttribute granterA = doc.CreateAttribute("", "granter", ""); granterA.Value = m_Item.PermsGranter.ToString(); permissionsN.Attributes.Append(granterA); XmlAttribute maskA = doc.CreateAttribute("", "mask", ""); maskA.Value = m_Item.PermsMask.ToString(); permissionsN.Attributes.Append(maskA); m_RunOnePhase = "GetExecutionState E"; CheckRunLockInvariants(true); // "DetectParams" are returned by llDetected...() script functions // for the currently active event, if any. if (m_DetectParams != null) { XmlElement detParArrayN = doc.CreateElement("", "DetectArray", ""); AppendXMLDetectArray(doc, detParArrayN, m_DetectParams); scriptStateN.AppendChild(detParArrayN); } m_RunOnePhase = "GetExecutionState F"; CheckRunLockInvariants(true); // Save any events we have in the queue. // <EventQueue> // <Event Name="..."> // <param>...</param> ... // <DetectParams>...</DetectParams> ... // </Event> // ... // </EventQueue> XmlElement queuedEventsN = doc.CreateElement("", "EventQueue", ""); lock (m_QueueLock) { foreach (EventParams evt in m_EventQueue) { XmlElement singleEventN = doc.CreateElement("", "Event", ""); singleEventN.SetAttribute("Name", evt.EventName); AppendXMLObjectArray(doc, singleEventN, evt.Params, "param"); AppendXMLDetectArray(doc, singleEventN, evt.DetectParams); queuedEventsN.AppendChild(singleEventN); } } scriptStateN.AppendChild(queuedEventsN); m_RunOnePhase = "GetExecutionState G"; CheckRunLockInvariants(true); // "Plugins" indicate enabled timers and listens, etc. Object[] pluginData = AsyncCommandManager.GetSerializationData(m_Engine, m_ItemID); XmlNode plugins = doc.CreateElement("", "Plugins", ""); AppendXMLObjectArray(doc, plugins, pluginData, "plugin"); scriptStateN.AppendChild(plugins); m_RunOnePhase = "GetExecutionState H"; CheckRunLockInvariants(true); // Let script run again. suspendOnCheckRunHold = false; m_RunOnePhase = "GetExecutionState leave"; CheckRunLockInvariants(true); } // scriptStateN represents the contents of the .state file so // write the .state file while we are here. using (FileStream fs = File.Create(m_StateFileName)) { using (StreamWriter sw = new StreamWriter(fs)) sw.Write(scriptStateN.OuterXml); } return(scriptStateN); }
public HttpRequest(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; }
public Dataserver(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; }
public ScriptInstance(IScriptEngine engine, SceneObjectPart part, UUID itemID, UUID assetID, string assembly, AppDomain dom, string primName, string scriptName, int startParam, bool postOnRez, StateSource stateSource, int maxScriptQueue) { m_Engine = engine; m_LocalID = part.LocalId; m_ObjectID = part.UUID; m_ItemID = itemID; m_AssetID = assetID; m_PrimName = primName; m_ScriptName = scriptName; m_Assembly = assembly; m_StartParam = startParam; m_MaxScriptQueue = maxScriptQueue; m_stateSource = stateSource; m_postOnRez = postOnRez; m_AttachedAvatar = part.AttachedAvatar; m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; if (part != null) { lock (part.TaskInventory) { if (part.TaskInventory.ContainsKey(m_ItemID)) { m_thisScriptTask = part.TaskInventory[m_ItemID]; } } } ApiManager am = new ApiManager(); foreach (string api in am.GetApis()) { m_Apis[api] = am.CreateApi(api); m_Apis[api].Initialize(engine, part, m_LocalID, itemID); } try { if (dom != System.AppDomain.CurrentDomain) { m_Script = (IScript)dom.CreateInstanceAndUnwrap( Path.GetFileNameWithoutExtension(assembly), "SecondLife.Script"); } else { m_Script = (IScript)Assembly.Load( Path.GetFileNameWithoutExtension(assembly)).CreateInstance( "SecondLife.Script"); } //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); // lease.Register(this); } catch (Exception) { // m_log.ErrorFormat("[Script] Error loading assembly {0}\n"+e.ToString(), assembly); } try { foreach (KeyValuePair <string, IScriptApi> kv in m_Apis) { m_Script.InitApi(kv.Key, kv.Value); } // // m_log.Debug("[Script] Script instance created"); part.SetScriptEvents(m_ItemID, (int)m_Script.GetStateEventFlags(State)); } catch (Exception) { // m_log.Error("[Script] Error loading script instance\n"+e.ToString()); return; } m_SaveState = true; string savedState = Path.Combine(Path.GetDirectoryName(assembly), m_ItemID.ToString() + ".state"); if (File.Exists(savedState)) { string xml = String.Empty; try { FileInfo fi = new FileInfo(savedState); int size = (int)fi.Length; if (size < 512000) { using (FileStream fs = File.Open(savedState, FileMode.Open, FileAccess.Read, FileShare.None)) { System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding(); Byte[] data = new Byte[size]; fs.Read(data, 0, size); xml = enc.GetString(data); ScriptSerializer.Deserialize(xml, this); AsyncCommandManager.CreateFromData(m_Engine, m_LocalID, m_ItemID, m_ObjectID, PluginData); // m_log.DebugFormat("[Script] Successfully retrieved state for script {0}.{1}", m_PrimName, m_ScriptName); part.SetScriptEvents(m_ItemID, (int)m_Script.GetStateEventFlags(State)); if (m_RunEvents && (!m_ShuttingDown)) { m_RunEvents = false; } else { m_RunEvents = false; m_startOnInit = false; } // we get new rez events on sim restart, too // but if there is state, then we fire the change // event // We loaded state, don't force a re-save m_SaveState = false; m_startedFromSavedState = true; } } else { // m_log.Error("[Script] Unable to load script state: Memory limit exceeded"); } } catch (Exception) { // m_log.ErrorFormat("[Script] Unable to load script state from xml: {0}\n"+e.ToString(), xml); } } // else // { // ScenePresence presence = m_Engine.World.GetScenePresence(part.OwnerID); // if (presence != null && (!postOnRez)) // presence.ControllingClient.SendAgentAlertMessage("Compile successful", false); // } }
public void DestroyScriptInstance() { ReleaseControls(); AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID); }
/** * @brief Load script state from the given XML doc into the script memory * <ScriptState Engine="YEngine" Asset=...> * <Running>...</Running> * <DoGblInit>...</DoGblInit> * <Permissions granted=... mask=... /> * RestoreDetectParams() * <Plugins> * ExtractXMLObjectArray("plugin") * </Plugins> * <Snapshot> * MigrateInEventHandler() * </Snapshot> * </ScriptState> */ private void LoadScriptState(XmlDocument doc) { // Everything we know is enclosed in <ScriptState>...</ScriptState> XmlElement scriptStateN = (XmlElement)doc.SelectSingleNode("ScriptState"); if (scriptStateN == null) { throw new Exception("no <ScriptState> tag"); } XmlElement XvariablesN = null; string sen = scriptStateN.GetAttribute("Engine"); if ((sen == null) || (sen != m_Engine.ScriptEngineName)) { XvariablesN = (XmlElement)scriptStateN.SelectSingleNode("Variables"); if (XvariablesN == null) { throw new Exception("<ScriptState> missing Engine=\"YEngine\" attribute"); } processXstate(doc); return; } // AssetID is unique for the script source text so make sure the // state file was written for that source file string assetID = scriptStateN.GetAttribute("Asset"); if (assetID != m_Item.AssetID.ToString()) { throw new Exception("<ScriptState> assetID mismatch"); } // Also match the sourceHash in case script was // loaded via 'xmroption fetchsource' and has changed string sourceHash = scriptStateN.GetAttribute("SourceHash"); if ((sourceHash == null) || (sourceHash != m_ObjCode.sourceHash)) { throw new Exception("<ScriptState> SourceHash mismatch"); } // Get various attributes XmlElement runningN = (XmlElement)scriptStateN.SelectSingleNode("Running"); m_Running = bool.Parse(runningN.InnerText); XmlElement doGblInitN = (XmlElement)scriptStateN.SelectSingleNode("DoGblInit"); doGblInit = bool.Parse(doGblInitN.InnerText); if (m_XMRLSLApi != null) { XmlElement scpttimeN = (XmlElement)scriptStateN.SelectSingleNode("scrpTime"); if (scpttimeN != null && Double.TryParse(scpttimeN.InnerText, out double t)) { m_XMRLSLApi.SetLSLTimer(Util.GetTimeStampMS() - t); } } double minEventDelay = 0.0; XmlElement minEventDelayN = (XmlElement)scriptStateN.SelectSingleNode("mEvtDly"); if (minEventDelayN != null) { minEventDelay = Double.Parse(minEventDelayN.InnerText); } // get values used by stuff like llDetectedGrab, etc. DetectParams[] detParams = RestoreDetectParams(scriptStateN.SelectSingleNode("DetectArray")); // Restore queued events LinkedList <EventParams> eventQueue = RestoreEventQueue(scriptStateN.SelectSingleNode("EventQueue")); // Restore timers and listeners XmlElement pluginN = (XmlElement)scriptStateN.SelectSingleNode("Plugins"); Object[] pluginData = ExtractXMLObjectArray(pluginN, "plugin"); // Script's global variables and stack contents XmlElement snapshotN = (XmlElement)scriptStateN.SelectSingleNode("Snapshot"); Byte[] data = Convert.FromBase64String(snapshotN.InnerText); using (MemoryStream ms = new MemoryStream()) { ms.Write(data, 0, data.Length); ms.Seek(0, SeekOrigin.Begin); MigrateInEventHandler(ms); } XmlElement permissionsN = (XmlElement)scriptStateN.SelectSingleNode("Permissions"); m_Item.PermsGranter = new UUID(permissionsN.GetAttribute("granter")); m_Item.PermsMask = Convert.ToInt32(permissionsN.GetAttribute("mask")); m_Part.Inventory.UpdateInventoryItem(m_Item, false, false); // Restore event queues, preserving any events that queued // whilst we were restoring the state lock (m_QueueLock) { m_DetectParams = detParams; foreach (EventParams evt in m_EventQueue) { eventQueue.AddLast(evt); } m_EventQueue = eventQueue; for (int i = m_EventCounts.Length; --i >= 0;) { m_EventCounts[i] = 0; } foreach (EventParams evt in m_EventQueue) { if (m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode eventCode)) { m_EventCounts[(int)eventCode]++; } } } // Requeue timer and listeners (possibly queuing new events) AsyncCommandManager.CreateFromData(m_Engine, m_LocalID, m_ItemID, m_Part.UUID, pluginData); MinEventDelay = minEventDelay; }
private void processXstate(XmlDocument doc) { XmlNodeList rootL = doc.GetElementsByTagName("ScriptState"); if (rootL.Count != 1) { throw new Exception("Xstate <ScriptState> missing"); } XmlNode rootNode = rootL[0]; if (rootNode == null) { throw new Exception("Xstate root missing"); } string stateName = ""; bool running = false; UUID permsGranter = UUID.Zero; int permsMask = 0; double minEventDelay = 0.0; Object[] pluginData = new Object[0]; LinkedList <EventParams> eventQueue = new LinkedList <EventParams>(); Dictionary <string, int> intNames = new Dictionary <string, int>(); Dictionary <string, int> doubleNames = new Dictionary <string, int>(); Dictionary <string, int> stringNames = new Dictionary <string, int>(); Dictionary <string, int> vectorNames = new Dictionary <string, int>(); Dictionary <string, int> rotationNames = new Dictionary <string, int>(); Dictionary <string, int> listNames = new Dictionary <string, int>(); int nn = m_ObjCode.globalVarNames.Count; int[] ints = null; double[] doubles = null; string[] strings = null; LSL_Vector[] vectors = null; LSL_Rotation[] rotations = null; LSL_List[] lists = null; if (nn > 0) { if (m_ObjCode.globalVarNames.ContainsKey("iarIntegers")) { getvarNames(m_ObjCode.globalVarNames["iarIntegers"], intNames); ints = new int[m_ObjCode.globalVarNames["iarIntegers"].Count]; } if (m_ObjCode.globalVarNames.ContainsKey("iarFloats")) { getvarNames(m_ObjCode.globalVarNames["iarFloats"], doubleNames); doubles = new double[m_ObjCode.globalVarNames["iarFloats"].Count]; } if (m_ObjCode.globalVarNames.ContainsKey("iarVectors")) { getvarNames(m_ObjCode.globalVarNames["iarVectors"], vectorNames); vectors = new LSL_Vector[m_ObjCode.globalVarNames["iarVectors"].Count]; } if (m_ObjCode.globalVarNames.ContainsKey("iarRotations")) { getvarNames(m_ObjCode.globalVarNames["iarRotations"], rotationNames); rotations = new LSL_Rotation[m_ObjCode.globalVarNames["iarRotations"].Count]; } if (m_ObjCode.globalVarNames.ContainsKey("iarStrings")) { getvarNames(m_ObjCode.globalVarNames["iarStrings"], stringNames); strings = new string[m_ObjCode.globalVarNames["iarStrings"].Count]; } if (m_ObjCode.globalVarNames.ContainsKey("iarLists")) { getvarNames(m_ObjCode.globalVarNames["iarLists"], listNames); lists = new LSL_List[m_ObjCode.globalVarNames["iarLists"].Count]; } } int heapsz = 0; try { XmlNodeList partL = rootNode.ChildNodes; foreach (XmlNode part in partL) { switch (part.Name) { case "State": stateName = part.InnerText; break; case "Running": running = bool.Parse(part.InnerText); break; case "Variables": int indx; XmlNodeList varL = part.ChildNodes; foreach (XmlNode var in varL) { string varName; object o = ReadXTypedValue(var, out varName); Type otype = o.GetType(); if (otype == typeof(LSL_Integer)) { if (intNames.TryGetValue(varName, out indx)) { ints[indx] = ((LSL_Integer)o); } continue; } if (otype == typeof(LSL_Float)) { if (doubleNames.TryGetValue(varName, out indx)) { doubles[indx] = ((LSL_Float)o); } continue; } if (otype == typeof(LSL_String)) { if (stringNames.TryGetValue(varName, out indx)) { strings[indx] = ((LSL_String)o); heapsz += ((LSL_String)o).Length; } continue; } if (otype == typeof(LSL_Rotation)) { if (rotationNames.TryGetValue(varName, out indx)) { rotations[indx] = ((LSL_Rotation)o); } continue; } if (otype == typeof(LSL_Vector)) { if (vectorNames.TryGetValue(varName, out indx)) { vectors[indx] = ((LSL_Vector)o); } continue; } if (otype == typeof(LSL_Key)) { if (stringNames.TryGetValue(varName, out indx)) { strings[indx] = ((LSL_Key)o); heapsz += ((LSL_String)o).Length; } continue; } if (otype == typeof(UUID)) { if (stringNames.TryGetValue(varName, out indx)) { LSL_String id = ((UUID)o).ToString(); strings[indx] = (id); heapsz += id.Length; } continue; } if (otype == typeof(LSL_List)) { if (listNames.TryGetValue(varName, out indx)) { LSL_List lo = (LSL_List)o; lists[indx] = (lo); heapsz += lo.Size; } continue; } } break; case "Queue": XmlNodeList itemL = part.ChildNodes; foreach (XmlNode item in itemL) { List <Object> parms = new List <Object>(); List <DetectParams> detected = new List <DetectParams>(); string eventName = item.Attributes.GetNamedItem("event").Value; XmlNodeList eventL = item.ChildNodes; foreach (XmlNode evt in eventL) { switch (evt.Name) { case "Params": XmlNodeList prms = evt.ChildNodes; foreach (XmlNode pm in prms) { parms.Add(ReadXTypedValue(pm)); } break; case "Detected": XmlNodeList detL = evt.ChildNodes; foreach (XmlNode det in detL) { string vect = det.Attributes.GetNamedItem("pos").Value; LSL_Vector v = new LSL_Vector(vect); int d_linkNum = 0; UUID d_group = UUID.Zero; string d_name = String.Empty; UUID d_owner = UUID.Zero; LSL_Vector d_position = new LSL_Vector(); LSL_Rotation d_rotation = new LSL_Rotation(); int d_type = 0; LSL_Vector d_velocity = new LSL_Vector(); try { string tmp; tmp = det.Attributes.GetNamedItem("linkNum").Value; int.TryParse(tmp, out d_linkNum); tmp = det.Attributes.GetNamedItem("group").Value; UUID.TryParse(tmp, out d_group); d_name = det.Attributes.GetNamedItem("name").Value; tmp = det.Attributes.GetNamedItem("owner").Value; UUID.TryParse(tmp, out d_owner); tmp = det.Attributes.GetNamedItem("position").Value; d_position = new LSL_Types.Vector3(tmp); tmp = det.Attributes.GetNamedItem("rotation").Value; d_rotation = new LSL_Rotation(tmp); tmp = det.Attributes.GetNamedItem("type").Value; int.TryParse(tmp, out d_type); tmp = det.Attributes.GetNamedItem("velocity").Value; d_velocity = new LSL_Vector(tmp); } catch (Exception) // Old version XML { } UUID uuid = new UUID(); UUID.TryParse(det.InnerText, out uuid); DetectParams d = new DetectParams(); d.Key = uuid; d.OffsetPos = v; d.LinkNum = d_linkNum; d.Group = d_group; d.Name = d_name; d.Owner = d_owner; d.Position = d_position; d.Rotation = d_rotation; d.Type = d_type; d.Velocity = d_velocity; detected.Add(d); } break; } } EventParams ep = new EventParams( eventName, parms.ToArray(), detected.ToArray()); eventQueue.AddLast(ep); } break; case "Plugins": List <Object> olist = new List <Object>(); XmlNodeList itemLP = part.ChildNodes; foreach (XmlNode item in itemLP) { olist.Add(ReadXTypedValue(item)); } pluginData = olist.ToArray(); break; case "Permissions": string tmpPerm; int mask = 0; tmpPerm = part.Attributes.GetNamedItem("mask").Value; if (tmpPerm != null) { int.TryParse(tmpPerm, out mask); if (mask != 0) { tmpPerm = part.Attributes.GetNamedItem("granter").Value; if (tmpPerm != null) { UUID granter = new UUID(); UUID.TryParse(tmpPerm, out granter); if (granter != UUID.Zero) { permsMask = mask; permsGranter = granter; } } } } break; case "MinEventDelay": double.TryParse(part.InnerText, out minEventDelay); break; } } } catch { throw new Exception("Xstate fail decode"); } int k = 0; stateCode = 0; foreach (string sn in m_ObjCode.stateNames) { if (stateName == sn) { stateCode = k; break; } k++; } eventCode = ScriptEventCode.None; m_Running = running; doGblInit = false; m_Item.PermsGranter = permsGranter; m_Item.PermsMask = permsMask; m_Part.Inventory.UpdateInventoryItem(m_Item, false, false); lock (m_RunLock) { glblVars.iarIntegers = ints; glblVars.iarFloats = doubles; glblVars.iarVectors = vectors; glblVars.iarRotations = rotations; glblVars.iarStrings = strings; glblVars.iarLists = lists; AddArraysHeapUse(heapsz); CheckRunLockInvariants(true); } lock (m_QueueLock) { m_DetectParams = null; foreach (EventParams evt in m_EventQueue) { eventQueue.AddLast(evt); } m_EventQueue = eventQueue; for (int i = m_EventCounts.Length; --i >= 0;) { m_EventCounts[i] = 0; } foreach (EventParams evt in m_EventQueue) { if (m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode evtCode)) { m_EventCounts[(int)evtCode]++; } } } AsyncCommandManager.CreateFromData(m_Engine, m_LocalID, m_ItemID, m_Part.UUID, pluginData); MinEventDelay = minEventDelay; }
/// <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); } }
public void DestroyScriptInstance() { ReleaseControls(); AsyncCommandManager.UnregisterScriptFacilities(Engine, LocalID, ItemID, true); }
/// <summary> /// Load the script from an assembly into an AppDomain. /// </summary> /// <param name='dom'></param> /// <param name='assembly'></param> /// <param name='stateSource'></param> /// <returns>false if load failed, true if suceeded</returns> public bool Load(AppDomain dom, string assembly, StateSource stateSource) { m_Assembly = assembly; m_stateSource = stateSource; ApiManager am = new ApiManager(); foreach (string api in am.GetApis()) { m_Apis[api] = am.CreateApi(api); m_Apis[api].Initialize(Engine, Part, ScriptTask, m_coopSleepHandle); } try { object[] constructorParams; Assembly scriptAssembly = dom.Load(Path.GetFileNameWithoutExtension(assembly)); Type scriptType = scriptAssembly.GetType("SecondLife.XEngineScript"); if (scriptType != null) { constructorParams = new object[] { m_coopSleepHandle }; } else { m_log.ErrorFormat( "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. You must remove all existing {6}* script DLL files before using enabling co-op termination" + ", either by setting DeleteScriptsOnStartup = true in [XEngine] for one run" + " or by deleting these files manually.", ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly); return(false); } // m_log.DebugFormat( // "[SCRIPT INSTANCE]: Looking to load {0} from assembly {1} in {2}", // scriptType.FullName, Path.GetFileNameWithoutExtension(assembly), Engine.World.Name); if (dom != System.AppDomain.CurrentDomain) { m_Script = (IScript)dom.CreateInstanceAndUnwrap( Path.GetFileNameWithoutExtension(assembly), scriptType.FullName, false, BindingFlags.Default, null, constructorParams, null, null); } else { m_Script = (IScript)scriptAssembly.CreateInstance( scriptType.FullName, false, BindingFlags.Default, null, constructorParams, null, null); } //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); // lease.Register(this); } catch (Exception e) { m_log.ErrorFormat( "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error loading assembly {6}. Exception {7}{8}", ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly, e.Message, e.StackTrace); return(false); } try { foreach (KeyValuePair <string, IScriptApi> kv in m_Apis) { m_Script.InitApi(kv.Key, kv.Value); } // // m_log.Debug("[Script] Script instance created"); Part.SetScriptEvents(ItemID, (int)m_Script.GetStateEventFlags(State)); } catch (Exception e) { m_log.ErrorFormat( "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error initializing script instance. Exception {6}{7}", ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, e.Message, e.StackTrace); return(false); } m_SaveState = true; string savedState = Path.Combine(Path.GetDirectoryName(assembly), ItemID.ToString() + ".state"); if (File.Exists(savedState)) { string xml = String.Empty; try { FileInfo fi = new FileInfo(savedState); int size = (int)fi.Length; if (size < 512000) { using (FileStream fs = File.Open(savedState, FileMode.Open, FileAccess.Read, FileShare.None)) { Byte[] data = new Byte[size]; fs.Read(data, 0, size); xml = Encoding.UTF8.GetString(data); ScriptSerializer.Deserialize(xml, this); AsyncCommandManager.CreateFromData(Engine, LocalID, ItemID, ObjectID, PluginData); // m_log.DebugFormat("[Script] Successfully retrieved state for script {0}.{1}", PrimName, m_ScriptName); Part.SetScriptEvents(ItemID, (int)m_Script.GetStateEventFlags(State)); if (!Running) { m_startOnInit = false; } Running = false; // we get new rez events on sim restart, too // but if there is state, then we fire the change // event // We loaded state, don't force a re-save m_SaveState = false; m_startedFromSavedState = true; } } else { m_log.WarnFormat( "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. Memory limit exceeded.", ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState); } } catch (Exception e) { m_log.ErrorFormat( "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. XML is {7}. Exception {8}{9}", ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState, xml, e.Message, e.StackTrace); } } // else // { // ScenePresence presence = Engine.World.GetScenePresence(part.OwnerID); // if (presence != null && (!postOnRez)) // presence.ControllingClient.SendAgentAlertMessage("Compile successful", false); // } return(true); }
public void InitXMRLSLApi(XMRInstance i) { acm = m_AsyncCommands; inst = i; }
/// <summary> /// Process the next event queued for this script /// </summary> /// <returns></returns> public object EventProcessor() { if (m_Suspended) { return(0); } lock (m_Script) { EventParams data = null; lock (m_EventQueue) { data = (EventParams)m_EventQueue.Dequeue(); if (data == null) // Shouldn't happen { if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) { m_CurrentResult = m_Engine.QueueEventHandler(this); } else { m_CurrentResult = 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; } } //m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this); m_DetectParams = data.DetectParams; if (data.EventName == "state") // Hardcoded state change { // m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}", // m_PrimName, m_ScriptName, data.Params[0].ToString()); m_State = data.Params[0].ToString(); AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID); SceneObjectPart part = m_Engine.World.GetSceneObjectPart( m_LocalID); if (part != null) { part.SetScriptEvents(m_ItemID, (int)m_Script.GetStateEventFlags(State)); } } else { if (m_Engine.World.PipeEventsForScript(m_LocalID) || data.EventName == "control") // Don't freeze avies! { SceneObjectPart part = m_Engine.World.GetSceneObjectPart( m_LocalID); // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}", // m_PrimName, m_ScriptName, data.EventName, m_State); try { m_CurrentEvent = data.EventName; m_EventStart = DateTime.Now; m_InEvent = true; m_Script.ExecuteEvent(State, data.EventName, data.Params); 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: {0}", e.Message); m_InEvent = false; m_CurrentEvent = String.Empty; if ((!(e is TargetInvocationException) || (!(e.InnerException is SelfDeleteException) && !(e.InnerException is ScriptDeleteException))) && !(e is ThreadAbortException)) { try { // DISPLAY ERROR INWORLD string text = FormatException(e); if (text.Length > 1000) { text = text.Substring(0, 1000); } m_Engine.World.SimChat(Utils.StringToBytes(text), ChatTypeEnum.DebugChannel, 2147483647, part.AbsolutePosition, part.Name, part.UUID, false); } 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; if (part != null && part.ParentGroup != null) { m_Engine.World.DeleteSceneObject(part.ParentGroup, false); } } else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException)) { m_InSelfDelete = true; if (part != null && part.ParentGroup != null) { part.Inventory.RemoveInventoryItem(m_ItemID); } } } } } lock (m_EventQueue) { if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) { m_CurrentResult = m_Engine.QueueEventHandler(this); } else { m_CurrentResult = null; } } m_DetectParams = null; return(0); } }
public Dataserver(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; }
public SensorRepeat(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; maximumRange = CmdManager.m_ScriptEngine.Config.GetDouble("SensorMaxRange", 96.0d); maximumToReturn = CmdManager.m_ScriptEngine.Config.GetInt("SensorMaxResults", 16); }
public HttpRequest(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; }
public Listener(AsyncCommandManager CmdManager) { m_CmdManager = CmdManager; m_commsPlugin = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface <IWorldComm>(); }