Patch for mantis#1493: Several patches to xengine. Thanks Melanie!
parent
2b83aa931c
commit
990225a4ba
|
@ -257,7 +257,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
// FilePrefix + "_compiled_" + asset + ".dll");
|
// FilePrefix + "_compiled_" + asset + ".dll");
|
||||||
|
|
||||||
if (File.Exists(OutFile))
|
if (File.Exists(OutFile))
|
||||||
|
{
|
||||||
|
m_scriptEngine.Log.DebugFormat("[XEngine] Returning existing assembly for {0}", asset);
|
||||||
return OutFile;
|
return OutFile;
|
||||||
|
}
|
||||||
|
|
||||||
if (!Directory.Exists(ScriptEnginesPath))
|
if (!Directory.Exists(ScriptEnginesPath))
|
||||||
{
|
{
|
||||||
|
@ -422,9 +425,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
string srcFileName = FilePrefix + "_source_" + Path.GetFileNameWithoutExtension(OutFile) + ext;
|
string srcFileName = FilePrefix + "_source_" + Path.GetFileNameWithoutExtension(OutFile) + ext;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
File.WriteAllText(
|
File.WriteAllText(Path.Combine(Path.Combine(
|
||||||
Path.Combine("ScriptEngines", srcFileName),
|
ScriptEnginesPath,
|
||||||
Script);
|
m_scriptEngine.World.RegionInfo.RegionID.ToString()),
|
||||||
|
srcFileName), Script);
|
||||||
}
|
}
|
||||||
catch (Exception ex) // NOTLEGIT - Should be just catching FileIOException
|
catch (Exception ex) // NOTLEGIT - Should be just catching FileIOException
|
||||||
{
|
{
|
||||||
|
@ -504,6 +508,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
errtext += "No compile error. But not able to locate compiled file.";
|
errtext += "No compile error. But not able to locate compiled file.";
|
||||||
throw new Exception(errtext);
|
throw new Exception(errtext);
|
||||||
}
|
}
|
||||||
|
m_scriptEngine.Log.DebugFormat("[XEngine] Compiled new assembly for {0}", asset);
|
||||||
return OutFile;
|
return OutFile;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,10 @@ using System.Collections.Generic;
|
||||||
using System.Runtime.Remoting.Lifetime;
|
using System.Runtime.Remoting.Lifetime;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using Nini.Config;
|
||||||
using Axiom.Math;
|
using Axiom.Math;
|
||||||
using libsecondlife;
|
using libsecondlife;
|
||||||
|
using OpenSim;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Region.Environment;
|
using OpenSim.Region.Environment;
|
||||||
using OpenSim.Region.Environment.Interfaces;
|
using OpenSim.Region.Environment.Interfaces;
|
||||||
|
@ -973,6 +975,78 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetFlexi(SceneObjectPart part, bool flexi, int softness, float gravity, float friction,
|
||||||
|
float wind, float tension, LSL_Types.Vector3 Force)
|
||||||
|
{
|
||||||
|
if (part == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool needs_fakedelete = false;
|
||||||
|
if (flexi)
|
||||||
|
{
|
||||||
|
if (!part.Shape.FlexiEntry)
|
||||||
|
{
|
||||||
|
needs_fakedelete = true;
|
||||||
|
}
|
||||||
|
part.Shape.FlexiEntry = true; // this setting flexi true isn't working, but the below parameters do
|
||||||
|
// work once the prim is already flexi
|
||||||
|
part.Shape.FlexiSoftness = softness;
|
||||||
|
part.Shape.FlexiGravity = gravity;
|
||||||
|
part.Shape.FlexiDrag = friction;
|
||||||
|
part.Shape.FlexiWind = wind;
|
||||||
|
part.Shape.FlexiTension = tension;
|
||||||
|
part.Shape.FlexiForceX = (float)Force.x;
|
||||||
|
part.Shape.FlexiForceY = (float)Force.y;
|
||||||
|
part.Shape.FlexiForceZ = (float)Force.z;
|
||||||
|
part.Shape.PathCurve = 0x80;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (part.Shape.FlexiEntry)
|
||||||
|
{
|
||||||
|
needs_fakedelete = true;
|
||||||
|
}
|
||||||
|
part.Shape.FlexiEntry = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
needs_fakedelete = false;
|
||||||
|
if (needs_fakedelete)
|
||||||
|
{
|
||||||
|
if (part.ParentGroup != null)
|
||||||
|
{
|
||||||
|
part.ParentGroup.FakeDeleteGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part.ScheduleFullUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetPointLight(SceneObjectPart part, bool light, LSL_Types.Vector3 color, float intensity, float radius, float falloff)
|
||||||
|
{
|
||||||
|
if (part == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (light)
|
||||||
|
{
|
||||||
|
part.Shape.LightEntry = true;
|
||||||
|
part.Shape.LightColorR = (float)color.x;
|
||||||
|
part.Shape.LightColorG = (float)color.y;
|
||||||
|
part.Shape.LightColorB = (float)color.z;
|
||||||
|
part.Shape.LightIntensity = intensity;
|
||||||
|
part.Shape.LightRadius = radius;
|
||||||
|
part.Shape.LightFalloff = falloff;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
part.Shape.LightEntry = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
part.ScheduleFullUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public LSL_Types.Vector3 llGetColor(int face)
|
public LSL_Types.Vector3 llGetColor(int face)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
@ -4516,7 +4590,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
SetPos(part, v);
|
SetPos(part, v);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case 7: // PRIM_SIZE
|
||||||
|
if (remain < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
v=new LSL_Types.Vector3(rules.Data[idx++].ToString());
|
||||||
|
SetScale(part, v);
|
||||||
|
|
||||||
|
break;
|
||||||
case 8: // PRIM_ROTATION
|
case 8: // PRIM_ROTATION
|
||||||
if (remain < 1)
|
if (remain < 1)
|
||||||
return;
|
return;
|
||||||
|
@ -4555,13 +4636,31 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
SetAlpha(part, alpha, face);
|
SetAlpha(part, alpha, face);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
case 21: // PRIM_FLEXI
|
||||||
case 7: // PRIM_SIZE
|
if (remain < 7)
|
||||||
if (remain < 1)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
v=new LSL_Types.Vector3(rules.Data[idx++].ToString());
|
int flexi = Convert.ToInt32(rules.Data[idx++]);
|
||||||
SetScale(part, v);
|
int softness = Convert.ToInt32(rules.Data[idx++]);
|
||||||
|
float gravity = (float)Convert.ToDouble(rules.Data[idx++]);
|
||||||
|
float friction = (float)Convert.ToDouble(rules.Data[idx++]);
|
||||||
|
float wind = (float)Convert.ToDouble(rules.Data[idx++]);
|
||||||
|
float tension = (float)Convert.ToDouble(rules.Data[idx++]);
|
||||||
|
LSL_Types.Vector3 force =new LSL_Types.Vector3(rules.Data[idx++].ToString());
|
||||||
|
|
||||||
|
SetFlexi(part, (flexi == 1), softness, gravity, friction, wind, tension, force);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 23: // PRIM_POINT_LIGHT
|
||||||
|
if (remain < 5)
|
||||||
|
return;
|
||||||
|
int light = Convert.ToInt32(rules.Data[idx++]);
|
||||||
|
LSL_Types.Vector3 lightcolor =new LSL_Types.Vector3(rules.Data[idx++].ToString());
|
||||||
|
float intensity = (float)Convert.ToDouble(rules.Data[idx++]);
|
||||||
|
float radius = (float)Convert.ToDouble(rules.Data[idx++]);
|
||||||
|
float falloff = (float)Convert.ToDouble(rules.Data[idx++]);
|
||||||
|
|
||||||
|
SetPointLight(part, (light == 1), lightcolor, intensity, radius, falloff);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -5466,30 +5565,39 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
public void llSetObjectPermMask(int mask, int value)
|
public void llSetObjectPermMask(int mask, int value)
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
IConfigSource config = new IniConfigSource(Application.iniFilePath);
|
||||||
if (mask == BuiltIn_Commands_BaseClass.MASK_BASE)//0
|
if (config.Configs["XEngine"] == null)
|
||||||
|
config.AddConfig("XEngine");
|
||||||
|
|
||||||
|
if (config.Configs["XEngine"].GetBoolean("AllowGodFunctions", false))
|
||||||
{
|
{
|
||||||
m_host.BaseMask = (uint)value;
|
if (World.ExternalChecks.ExternalChecksCanRunConsoleCommand(m_host.OwnerID))
|
||||||
}
|
{
|
||||||
|
if (mask == BuiltIn_Commands_BaseClass.MASK_BASE)//0
|
||||||
|
{
|
||||||
|
m_host.BaseMask = (uint)value;
|
||||||
|
}
|
||||||
|
|
||||||
else if (mask == BuiltIn_Commands_BaseClass.MASK_OWNER)//1
|
else if (mask == BuiltIn_Commands_BaseClass.MASK_OWNER)//1
|
||||||
{
|
{
|
||||||
m_host.OwnerMask = (uint)value;
|
m_host.OwnerMask = (uint)value;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (mask == BuiltIn_Commands_BaseClass.MASK_GROUP)//2
|
else if (mask == BuiltIn_Commands_BaseClass.MASK_GROUP)//2
|
||||||
{
|
{
|
||||||
m_host.GroupMask = (uint)value;
|
m_host.GroupMask = (uint)value;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (mask == BuiltIn_Commands_BaseClass.MASK_EVERYONE)//3
|
else if (mask == BuiltIn_Commands_BaseClass.MASK_EVERYONE)//3
|
||||||
{
|
{
|
||||||
m_host.EveryoneMask = (uint)value;
|
m_host.EveryoneMask = (uint)value;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (mask == BuiltIn_Commands_BaseClass.MASK_NEXT)//4
|
else if (mask == BuiltIn_Commands_BaseClass.MASK_NEXT)//4
|
||||||
{
|
{
|
||||||
m_host.NextOwnerMask = (uint)value;
|
m_host.NextOwnerMask = (uint)value;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -425,6 +425,30 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Script
|
||||||
return new list(tmp);
|
return new list(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ExtendAndAdd(object o)
|
||||||
|
{
|
||||||
|
Array.Resize(ref m_data, Length + 1);
|
||||||
|
m_data.SetValue(o, Length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static list operator +(list a, string s)
|
||||||
|
{
|
||||||
|
a.ExtendAndAdd(s);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static list operator +(list a, int i)
|
||||||
|
{
|
||||||
|
a.ExtendAndAdd(i);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static list operator +(list a, double d)
|
||||||
|
{
|
||||||
|
a.ExtendAndAdd(d);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
public void Add(object o)
|
public void Add(object o)
|
||||||
{
|
{
|
||||||
object[] tmp;
|
object[] tmp;
|
||||||
|
@ -1321,6 +1345,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Script
|
||||||
return (double)i.value;
|
return (double)i.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static public implicit operator LSLFloat(LSLInteger i)
|
||||||
|
{
|
||||||
|
return new LSLFloat((double)i.value);
|
||||||
|
}
|
||||||
|
|
||||||
public static bool operator true(LSLInteger i)
|
public static bool operator true(LSLInteger i)
|
||||||
{
|
{
|
||||||
return i.value != 0;
|
return i.value != 0;
|
||||||
|
@ -1370,12 +1399,28 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Script
|
||||||
|
|
||||||
public LSLFloat(int i)
|
public LSLFloat(int i)
|
||||||
{
|
{
|
||||||
this.value = (double)i;
|
value = (double)i;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LSLFloat(double d)
|
public LSLFloat(double d)
|
||||||
{
|
{
|
||||||
this.value = d;
|
value = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
public LSLFloat(string s)
|
||||||
|
{
|
||||||
|
value = double.Parse(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public LSLFloat(Object o)
|
||||||
|
{
|
||||||
|
if(!((o is double) || (o is float)))
|
||||||
|
{
|
||||||
|
value = 0.0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = (double)o;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -1445,11 +1490,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Script
|
||||||
{
|
{
|
||||||
return f.value;
|
return f.value;
|
||||||
}
|
}
|
||||||
|
|
||||||
//static public implicit operator System.Int32(LSLFloat f)
|
static public explicit operator LSLString(LSLFloat f)
|
||||||
//{
|
{
|
||||||
// return (int)f.value;
|
string v = String.Format("{0:0.000000}", f.value);
|
||||||
//}
|
return new LSLString(v);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
|
@ -314,8 +314,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
{
|
{
|
||||||
assembly = m_Compiler.PerformScriptCompile(script,
|
assembly = m_Compiler.PerformScriptCompile(script,
|
||||||
assetID.ToString());
|
assetID.ToString());
|
||||||
m_log.DebugFormat("[XEngine] Loaded script {0}.{1}",
|
|
||||||
part.ParentGroup.RootPart.Name, item.Name);
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -387,8 +385,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
m_DomainScripts[appDomain].Add(itemID);
|
m_DomainScripts[appDomain].Add(itemID);
|
||||||
|
|
||||||
XScriptInstance instance = new XScriptInstance(this,localID,
|
XScriptInstance instance = new XScriptInstance(this,localID,
|
||||||
part.UUID, itemID, assetID, assembly,
|
part.UUID, itemID, assetID, assembly,
|
||||||
m_AppDomains[appDomain]);
|
m_AppDomains[appDomain],
|
||||||
|
part.ParentGroup.RootPart.Name,
|
||||||
|
item.Name);
|
||||||
|
|
||||||
|
m_log.DebugFormat("[XEngine] Loaded script {0}.{1}",
|
||||||
|
part.ParentGroup.RootPart.Name, item.Name);
|
||||||
|
|
||||||
instance.AppDomain = appDomain;
|
instance.AppDomain = appDomain;
|
||||||
|
|
||||||
|
@ -450,6 +453,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
UnloadAppDomain(instance.AppDomain);
|
UnloadAppDomain(instance.AppDomain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
instance.RemoveState();
|
||||||
|
|
||||||
instance = null;
|
instance = null;
|
||||||
|
|
||||||
CleanAssemblies();
|
CleanAssemblies();
|
||||||
|
@ -706,6 +711,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
private bool m_TimerQueued;
|
private bool m_TimerQueued;
|
||||||
private DateTime m_EventStart;
|
private DateTime m_EventStart;
|
||||||
private bool m_InEvent;
|
private bool m_InEvent;
|
||||||
|
private string m_PrimName;
|
||||||
|
private string m_ScriptName;
|
||||||
|
private string m_Assembly;
|
||||||
|
|
||||||
// Script state
|
// Script state
|
||||||
private string m_State="default";
|
private string m_State="default";
|
||||||
|
@ -715,6 +723,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
public bool Running
|
public bool Running
|
||||||
{
|
{
|
||||||
get { return m_RunEvents; }
|
get { return m_RunEvents; }
|
||||||
|
set { m_RunEvents = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string State
|
public string State
|
||||||
|
@ -734,6 +743,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
set { m_AppDomain = value; }
|
set { m_AppDomain = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string PrimName
|
||||||
|
{
|
||||||
|
get { return m_PrimName; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public string ScriptName
|
||||||
|
{
|
||||||
|
get { return m_ScriptName; }
|
||||||
|
}
|
||||||
|
|
||||||
public LLUUID ItemID
|
public LLUUID ItemID
|
||||||
{
|
{
|
||||||
get { return m_ItemID; }
|
get { return m_ItemID; }
|
||||||
|
@ -766,7 +785,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
}
|
}
|
||||||
|
|
||||||
public XScriptInstance(XEngine engine, uint localID, LLUUID objectID,
|
public XScriptInstance(XEngine engine, uint localID, LLUUID objectID,
|
||||||
LLUUID itemID, LLUUID assetID, string assembly, AppDomain dom)
|
LLUUID itemID, LLUUID assetID, string assembly, AppDomain dom,
|
||||||
|
string primName, string scriptName)
|
||||||
{
|
{
|
||||||
m_Engine = engine;
|
m_Engine = engine;
|
||||||
|
|
||||||
|
@ -774,6 +794,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
m_ObjectID = objectID;
|
m_ObjectID = objectID;
|
||||||
m_ItemID = itemID;
|
m_ItemID = itemID;
|
||||||
m_AssetID = assetID;
|
m_AssetID = assetID;
|
||||||
|
m_PrimName = primName;
|
||||||
|
m_ScriptName = scriptName;
|
||||||
|
m_Assembly = assembly;
|
||||||
|
|
||||||
SceneObjectPart part=engine.World.GetSceneObjectPart(localID);
|
SceneObjectPart part=engine.World.GetSceneObjectPart(localID);
|
||||||
if (part == null)
|
if (part == null)
|
||||||
|
@ -811,10 +834,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_Engine.Log.Error("Error loading script instance\n"+e.ToString());
|
m_Engine.Log.Error("[XEngine] Error loading script instance\n"+e.ToString());
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
string savedState = assembly + ".state";
|
string savedState = Path.Combine(Path.GetDirectoryName(assembly),
|
||||||
|
m_ItemID.ToString() + ".state");
|
||||||
if (File.Exists(savedState))
|
if (File.Exists(savedState))
|
||||||
{
|
{
|
||||||
string xml = String.Empty;
|
string xml = String.Empty;
|
||||||
|
@ -841,28 +866,53 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
m_Engine.m_ASYNCLSLCommandManager.CreateFromData(
|
m_Engine.m_ASYNCLSLCommandManager.CreateFromData(
|
||||||
m_LocalID, m_ItemID, m_ObjectID,
|
m_LocalID, m_ItemID, m_ObjectID,
|
||||||
PluginData);
|
PluginData);
|
||||||
|
|
||||||
|
m_Engine.Log.DebugFormat("[XEngine] Successfully retrieved state for script {0}.{1}", m_PrimName, m_ScriptName);
|
||||||
|
|
||||||
|
if(m_RunEvents)
|
||||||
|
{
|
||||||
|
m_RunEvents = false;
|
||||||
|
Start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_Engine.Log.Error("Unable to load script state: Memory limit exceeded");
|
m_Engine.Log.Error("[XEngine] Unable to load script state: Memory limit exceeded");
|
||||||
PostEvent(new XEventParams("state_entry",
|
PostEvent(new XEventParams("state_entry",
|
||||||
new Object[0], new XDetectParams[0]));
|
new Object[0], new XDetectParams[0]));
|
||||||
|
Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
m_Engine.Log.ErrorFormat("Unable to load script state from xml: {0}\n"+e.ToString(), xml);
|
m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state from xml: {0}\n"+e.ToString(), xml);
|
||||||
PostEvent(new XEventParams("state_entry",
|
PostEvent(new XEventParams("state_entry",
|
||||||
new Object[0], new XDetectParams[0]));
|
new Object[0], new XDetectParams[0]));
|
||||||
|
Start();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state, file not found");
|
||||||
PostEvent(new XEventParams("state_entry",
|
PostEvent(new XEventParams("state_entry",
|
||||||
new Object[0], new XDetectParams[0]));
|
new Object[0], new XDetectParams[0]));
|
||||||
|
Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveState()
|
||||||
|
{
|
||||||
|
string savedState = Path.Combine(Path.GetDirectoryName(m_Assembly),
|
||||||
|
m_ItemID.ToString() + ".state");
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.Delete(savedState);
|
||||||
|
}
|
||||||
|
catch(Exception)
|
||||||
|
{
|
||||||
}
|
}
|
||||||
Start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void VarDump(Dictionary<string, object> vars)
|
public void VarDump(Dictionary<string, object> vars)
|
||||||
|
@ -935,16 +985,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
|
|
||||||
result.Abort();
|
result.Abort();
|
||||||
|
|
||||||
if (SmartThreadPool.WaitAll(new IWorkItemResult[] {result}, new TimeSpan((long)10000000), false))
|
lock (m_EventQueue)
|
||||||
{
|
{
|
||||||
lock (m_EventQueue)
|
m_CurrentResult = null;
|
||||||
{
|
|
||||||
m_CurrentResult = null;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_Engine.Log.Error("[XEngine] Failed to reliably stop script");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -960,6 +1005,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
|
|
||||||
public void PostEvent(XEventParams data)
|
public void PostEvent(XEventParams data)
|
||||||
{
|
{
|
||||||
|
// m_Engine.Log.DebugFormat("[XEngine] Posted event {2} in state {3} to {0}.{1}",
|
||||||
|
// m_PrimName, m_ScriptName, data.EventName, m_State);
|
||||||
lock (m_EventQueue)
|
lock (m_EventQueue)
|
||||||
{
|
{
|
||||||
if (m_EventQueue.Count >= m_Engine.MaxScriptQueue)
|
if (m_EventQueue.Count >= m_Engine.MaxScriptQueue)
|
||||||
|
@ -1003,6 +1050,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
|
|
||||||
if (data.EventName == "state") // Hardcoded state change
|
if (data.EventName == "state") // Hardcoded state change
|
||||||
{
|
{
|
||||||
|
// m_Engine.Log.DebugFormat("[XEngine] Script {0}.{1} state set to {2}",
|
||||||
|
// m_PrimName, m_ScriptName, data.Params[0].ToString());
|
||||||
m_State=data.Params[0].ToString();
|
m_State=data.Params[0].ToString();
|
||||||
m_Engine.m_ASYNCLSLCommandManager.RemoveScript(
|
m_Engine.m_ASYNCLSLCommandManager.RemoveScript(
|
||||||
m_LocalID, m_ItemID);
|
m_LocalID, m_ItemID);
|
||||||
|
@ -1020,6 +1069,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
// m_Engine.Log.DebugFormat("[XEngine] Processed event {0}", data.EventName);
|
// m_Engine.Log.DebugFormat("[XEngine] Processed event {0}", data.EventName);
|
||||||
SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
|
SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
|
||||||
m_LocalID);
|
m_LocalID);
|
||||||
|
// m_Engine.Log.DebugFormat("[XEngine] Delivered event {2} in state {3} to {0}.{1}",
|
||||||
|
// m_PrimName, m_ScriptName, data.EventName, m_State);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_EventStart = DateTime.Now;
|
m_EventStart = DateTime.Now;
|
||||||
|
@ -1148,14 +1200,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
FileStream fs = File.Create(assembly + ".state");
|
FileStream fs = File.Create(Path.Combine(Path.GetDirectoryName(assembly), m_ItemID.ToString() + ".state"));
|
||||||
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
|
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
|
||||||
Byte[] buf = enc.GetBytes(xml);
|
Byte[] buf = enc.GetBytes(xml);
|
||||||
fs.Write(buf, 0, buf.Length);
|
fs.Write(buf, 0, buf.Length);
|
||||||
fs.Close();
|
fs.Close();
|
||||||
}
|
}
|
||||||
catch(Exception)
|
catch(Exception e)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("Unable to save xml\n"+e.ToString());
|
||||||
|
}
|
||||||
|
if(!File.Exists(Path.Combine(Path.GetDirectoryName(assembly), m_ItemID.ToString() + ".state")))
|
||||||
|
{
|
||||||
|
throw new Exception("Completed persistence save, but no file was created");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1181,6 +1238,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
|
|
||||||
rootElement.AppendChild(state);
|
rootElement.AppendChild(state);
|
||||||
|
|
||||||
|
XmlElement running = xmldoc.CreateElement("", "Running", "");
|
||||||
|
running.AppendChild(xmldoc.CreateTextNode(
|
||||||
|
instance.Running.ToString()));
|
||||||
|
|
||||||
|
rootElement.AppendChild(running);
|
||||||
|
|
||||||
Dictionary<string, Object> vars = instance.GetVars();
|
Dictionary<string, Object> vars = instance.GetVars();
|
||||||
|
|
||||||
XmlElement variables = xmldoc.CreateElement("", "Variables", "");
|
XmlElement variables = xmldoc.CreateElement("", "Variables", "");
|
||||||
|
@ -1277,6 +1340,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
case "State":
|
case "State":
|
||||||
instance.State=part.InnerText;
|
instance.State=part.InnerText;
|
||||||
break;
|
break;
|
||||||
|
case "Running":
|
||||||
|
instance.Running=bool.Parse(part.InnerText);
|
||||||
|
break;
|
||||||
case "Variables":
|
case "Variables":
|
||||||
XmlNodeList varL = part.ChildNodes;
|
XmlNodeList varL = part.ChildNodes;
|
||||||
foreach (XmlNode var in varL)
|
foreach (XmlNode var in varL)
|
||||||
|
|
|
@ -1668,6 +1668,7 @@
|
||||||
<Reference name="System.Runtime.Remoting" localCopy="false"/>
|
<Reference name="System.Runtime.Remoting" localCopy="false"/>
|
||||||
<Reference name="libsecondlife.dll"/>
|
<Reference name="libsecondlife.dll"/>
|
||||||
<Reference name="RAIL.dll"/>
|
<Reference name="RAIL.dll"/>
|
||||||
|
<Reference name="OpenSim"/>
|
||||||
<Reference name="OpenSim.Framework"/>
|
<Reference name="OpenSim.Framework"/>
|
||||||
<Reference name="OpenSim.Framework.Console"/>
|
<Reference name="OpenSim.Framework.Console"/>
|
||||||
<Reference name="OpenSim.Framework.Communications"/>
|
<Reference name="OpenSim.Framework.Communications"/>
|
||||||
|
|
Loading…
Reference in New Issue