Patch for mantis#1493: Several patches to xengine. Thanks Melanie!

0.6.0-stable
Adam Johnson 2008-06-07 17:43:07 +00:00
parent 2b83aa931c
commit 990225a4ba
5 changed files with 279 additions and 53 deletions

View File

@ -257,7 +257,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
// FilePrefix + "_compiled_" + asset + ".dll");
if (File.Exists(OutFile))
{
m_scriptEngine.Log.DebugFormat("[XEngine] Returning existing assembly for {0}", asset);
return OutFile;
}
if (!Directory.Exists(ScriptEnginesPath))
{
@ -422,9 +425,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
string srcFileName = FilePrefix + "_source_" + Path.GetFileNameWithoutExtension(OutFile) + ext;
try
{
File.WriteAllText(
Path.Combine("ScriptEngines", srcFileName),
Script);
File.WriteAllText(Path.Combine(Path.Combine(
ScriptEnginesPath,
m_scriptEngine.World.RegionInfo.RegionID.ToString()),
srcFileName), Script);
}
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.";
throw new Exception(errtext);
}
m_scriptEngine.Log.DebugFormat("[XEngine] Compiled new assembly for {0}", asset);
return OutFile;
}
}

View File

@ -31,8 +31,10 @@ using System.Collections.Generic;
using System.Runtime.Remoting.Lifetime;
using System.Text;
using System.Threading;
using Nini.Config;
using Axiom.Math;
using libsecondlife;
using OpenSim;
using OpenSim.Framework;
using OpenSim.Region.Environment;
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)
{
m_host.AddScriptLPS(1);
@ -4516,7 +4590,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
SetPos(part, v);
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
if (remain < 1)
return;
@ -4555,13 +4636,31 @@ namespace OpenSim.Region.ScriptEngine.XEngine
SetAlpha(part, alpha, face);
break;
case 7: // PRIM_SIZE
if (remain < 1)
case 21: // PRIM_FLEXI
if (remain < 7)
return;
v=new LSL_Types.Vector3(rules.Data[idx++].ToString());
SetScale(part, v);
int flexi = Convert.ToInt32(rules.Data[idx++]);
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;
}
@ -5466,30 +5565,39 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public void llSetObjectPermMask(int mask, int value)
{
m_host.AddScriptLPS(1);
if (mask == BuiltIn_Commands_BaseClass.MASK_BASE)//0
IConfigSource config = new IniConfigSource(Application.iniFilePath);
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
{
m_host.OwnerMask = (uint)value;
}
else if (mask == BuiltIn_Commands_BaseClass.MASK_OWNER)//1
{
m_host.OwnerMask = (uint)value;
}
else if (mask == BuiltIn_Commands_BaseClass.MASK_GROUP)//2
{
m_host.GroupMask = (uint)value;
}
else if (mask == BuiltIn_Commands_BaseClass.MASK_GROUP)//2
{
m_host.GroupMask = (uint)value;
}
else if (mask == BuiltIn_Commands_BaseClass.MASK_EVERYONE)//3
{
m_host.EveryoneMask = (uint)value;
}
else if (mask == BuiltIn_Commands_BaseClass.MASK_EVERYONE)//3
{
m_host.EveryoneMask = (uint)value;
}
else if (mask == BuiltIn_Commands_BaseClass.MASK_NEXT)//4
{
m_host.NextOwnerMask = (uint)value;
else if (mask == BuiltIn_Commands_BaseClass.MASK_NEXT)//4
{
m_host.NextOwnerMask = (uint)value;
}
}
}
}

View File

@ -425,6 +425,30 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Script
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)
{
object[] tmp;
@ -1321,6 +1345,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Script
return (double)i.value;
}
static public implicit operator LSLFloat(LSLInteger i)
{
return new LSLFloat((double)i.value);
}
public static bool operator true(LSLInteger i)
{
return i.value != 0;
@ -1370,12 +1399,28 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Script
public LSLFloat(int i)
{
this.value = (double)i;
value = (double)i;
}
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
@ -1445,11 +1490,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Script
{
return f.value;
}
//static public implicit operator System.Int32(LSLFloat f)
//{
// return (int)f.value;
//}
static public explicit operator LSLString(LSLFloat f)
{
string v = String.Format("{0:0.000000}", f.value);
return new LSLString(v);
}
#endregion

View File

@ -314,8 +314,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
{
assembly = m_Compiler.PerformScriptCompile(script,
assetID.ToString());
m_log.DebugFormat("[XEngine] Loaded script {0}.{1}",
part.ParentGroup.RootPart.Name, item.Name);
}
catch (Exception e)
{
@ -387,8 +385,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_DomainScripts[appDomain].Add(itemID);
XScriptInstance instance = new XScriptInstance(this,localID,
part.UUID, itemID, assetID, assembly,
m_AppDomains[appDomain]);
part.UUID, itemID, assetID, assembly,
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;
@ -450,6 +453,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
UnloadAppDomain(instance.AppDomain);
}
instance.RemoveState();
instance = null;
CleanAssemblies();
@ -706,6 +711,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
private bool m_TimerQueued;
private DateTime m_EventStart;
private bool m_InEvent;
private string m_PrimName;
private string m_ScriptName;
private string m_Assembly;
// Script state
private string m_State="default";
@ -715,6 +723,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public bool Running
{
get { return m_RunEvents; }
set { m_RunEvents = value; }
}
public string State
@ -734,6 +743,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine
set { m_AppDomain = value; }
}
public string PrimName
{
get { return m_PrimName; }
}
public string ScriptName
{
get { return m_ScriptName; }
}
public LLUUID ItemID
{
get { return m_ItemID; }
@ -766,7 +785,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
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;
@ -774,6 +794,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_ObjectID = objectID;
m_ItemID = itemID;
m_AssetID = assetID;
m_PrimName = primName;
m_ScriptName = scriptName;
m_Assembly = assembly;
SceneObjectPart part=engine.World.GetSceneObjectPart(localID);
if (part == null)
@ -811,10 +834,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
}
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))
{
string xml = String.Empty;
@ -841,28 +866,53 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_Engine.m_ASYNCLSLCommandManager.CreateFromData(
m_LocalID, m_ItemID, m_ObjectID,
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
{
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",
new Object[0], new XDetectParams[0]));
Start();
}
}
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",
new Object[0], new XDetectParams[0]));
Start();
}
}
else
{
m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state, file not found");
PostEvent(new XEventParams("state_entry",
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)
@ -935,16 +985,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
result.Abort();
if (SmartThreadPool.WaitAll(new IWorkItemResult[] {result}, new TimeSpan((long)10000000), false))
lock (m_EventQueue)
{
lock (m_EventQueue)
{
m_CurrentResult = null;
}
return true;
m_CurrentResult = null;
}
m_Engine.Log.Error("[XEngine] Failed to reliably stop script");
return true;
}
@ -960,6 +1005,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
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)
{
if (m_EventQueue.Count >= m_Engine.MaxScriptQueue)
@ -1003,6 +1050,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
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_Engine.m_ASYNCLSLCommandManager.RemoveScript(
m_LocalID, m_ItemID);
@ -1020,6 +1069,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
// m_Engine.Log.DebugFormat("[XEngine] Processed event {0}", data.EventName);
SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
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
{
m_EventStart = DateTime.Now;
@ -1148,14 +1200,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine
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();
Byte[] buf = enc.GetBytes(xml);
fs.Write(buf, 0, buf.Length);
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);
XmlElement running = xmldoc.CreateElement("", "Running", "");
running.AppendChild(xmldoc.CreateTextNode(
instance.Running.ToString()));
rootElement.AppendChild(running);
Dictionary<string, Object> vars = instance.GetVars();
XmlElement variables = xmldoc.CreateElement("", "Variables", "");
@ -1277,6 +1340,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
case "State":
instance.State=part.InnerText;
break;
case "Running":
instance.Running=bool.Parse(part.InnerText);
break;
case "Variables":
XmlNodeList varL = part.ChildNodes;
foreach (XmlNode var in varL)

View File

@ -1668,6 +1668,7 @@
<Reference name="System.Runtime.Remoting" localCopy="false"/>
<Reference name="libsecondlife.dll"/>
<Reference name="RAIL.dll"/>
<Reference name="OpenSim"/>
<Reference name="OpenSim.Framework"/>
<Reference name="OpenSim.Framework.Console"/>
<Reference name="OpenSim.Framework.Communications"/>