Script region crossing. This has not user functionality, but lays all the

groundwork.
0.6.1-post-fixes
Melanie Thielker 2008-11-09 19:30:40 +00:00
parent 6c27321949
commit 664e8a464e
13 changed files with 157 additions and 32 deletions

View File

@ -192,7 +192,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
foreach (SceneObjectGroup sceneObject in sceneObjects) foreach (SceneObjectGroup sceneObject in sceneObjects)
{ {
sceneObject.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine); sceneObject.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 0);
} }
} }

View File

@ -180,7 +180,7 @@ namespace OpenSim.Region.Environment.Scenes
foreach (SceneObjectGroup sceneObject in sceneObjects) foreach (SceneObjectGroup sceneObject in sceneObjects)
{ {
sceneObject.CreateScriptInstances(0, true, scene.DefaultScriptEngine); sceneObject.CreateScriptInstances(0, true, scene.DefaultScriptEngine, 0);
} }
} }

View File

@ -104,7 +104,7 @@ namespace OpenSim.Region.Environment.Scenes
public event OnPermissionErrorDelegate OnPermissionError; public event OnPermissionErrorDelegate OnPermissionError;
public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine); public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource);
public event NewRezScript OnRezScript; public event NewRezScript OnRezScript;
@ -548,13 +548,13 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource)
{ {
handlerRezScript = OnRezScript; handlerRezScript = OnRezScript;
if (handlerRezScript != null) if (handlerRezScript != null)
{ {
handlerRezScript(localID, itemID, script, startParam, handlerRezScript(localID, itemID, script, startParam,
postOnRez, engine); postOnRez, engine, stateSource);
} }
} }

View File

@ -1667,7 +1667,7 @@ namespace OpenSim.Region.Environment.Scenes
copy.UpdateGroupRotation(rot); copy.UpdateGroupRotation(rot);
} }
copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine); copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0);
copy.HasGroupChanged = true; copy.HasGroupChanged = true;
copy.ScheduleGroupForFullUpdate(); copy.ScheduleGroupForFullUpdate();
return copy; return copy;

View File

@ -61,7 +61,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (group is SceneObjectGroup) if (group is SceneObjectGroup)
{ {
((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine); ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
} }
} }
} }
@ -292,7 +292,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
// Needs to determine which engine was running it and use that // Needs to determine which engine was running it and use that
// //
part.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine); part.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0);
} }
else else
{ {
@ -1343,7 +1343,7 @@ namespace OpenSim.Region.Environment.Scenes
part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID);
// TODO: switch to posting on_rez here when scripts // TODO: switch to posting on_rez here when scripts
// have state in inventory // have state in inventory
part.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine); part.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0);
// m_log.InfoFormat("[PRIMINVENTORY]: " + // m_log.InfoFormat("[PRIMINVENTORY]: " +
// "Rezzed script {0} into prim local ID {1} for user {2}", // "Rezzed script {0} into prim local ID {1} for user {2}",
@ -1407,7 +1407,7 @@ namespace OpenSim.Region.Environment.Scenes
part.AddInventoryItem(taskItem); part.AddInventoryItem(taskItem);
part.GetProperties(remoteClient); part.GetProperties(remoteClient);
part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine); part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
} }
} }
@ -1503,7 +1503,7 @@ namespace OpenSim.Region.Environment.Scenes
if (running > 0) if (running > 0)
{ {
destPart.CreateScriptInstance(destTaskItem, 0, false, DefaultScriptEngine); destPart.CreateScriptInstance(destTaskItem, 0, false, DefaultScriptEngine, 0);
} }
ScenePresence avatar; ScenePresence avatar;
@ -2050,7 +2050,7 @@ namespace OpenSim.Region.Environment.Scenes
} }
// Fire on_rez // Fire on_rez
group.CreateScriptInstances(0, true, DefaultScriptEngine); group.CreateScriptInstances(0, true, DefaultScriptEngine, 0);
if (!attachment) if (!attachment)
rootPart.ScheduleFullUpdate(); rootPart.ScheduleFullUpdate();
@ -2154,7 +2154,7 @@ namespace OpenSim.Region.Environment.Scenes
group.UpdateGroupRotation(rot); group.UpdateGroupRotation(rot);
//group.ApplyPhysics(m_physicalPrim); //group.ApplyPhysics(m_physicalPrim);
group.Velocity = vel; group.Velocity = vel;
group.CreateScriptInstances(param, true, DefaultScriptEngine); group.CreateScriptInstances(param, true, DefaultScriptEngine, 0);
rootPart.ScheduleFullUpdate(); rootPart.ScheduleFullUpdate();
if (!ExternalChecks.ExternalChecksBypassPermissions()) if (!ExternalChecks.ExternalChecksBypassPermissions())

View File

@ -30,6 +30,7 @@ using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.IO; using System.IO;
using System.Xml;
using System.Threading; using System.Threading;
using System.Timers; using System.Timers;
using OpenMetaverse; using OpenMetaverse;
@ -591,7 +592,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine); ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
} }
} }
} }

View File

@ -26,11 +26,14 @@
*/ */
using System; using System;
using System.IO;
using System.Reflection; using System.Reflection;
using OpenMetaverse; using OpenMetaverse;
using log4net; using log4net;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using System.Collections.Generic;
using System.Xml;
namespace OpenSim.Region.Environment.Scenes namespace OpenSim.Region.Environment.Scenes
{ {
@ -56,14 +59,15 @@ namespace OpenSim.Region.Environment.Scenes
/// Start the scripts contained in all the prims in this group. /// Start the scripts contained in all the prims in this group.
/// </summary> /// </summary>
public void CreateScriptInstances(int startParam, bool postOnRez, public void CreateScriptInstances(int startParam, bool postOnRez,
string engine) string engine, int stateSource)
{ {
// Don't start scripts if they're turned off in the region! // Don't start scripts if they're turned off in the region!
if (!m_scene.RegionInfo.RegionSettings.DisableScripts) if (!m_scene.RegionInfo.RegionSettings.DisableScripts)
{ {
foreach (SceneObjectPart part in m_parts.Values) foreach (SceneObjectPart part in m_parts.Values)
{ {
part.CreateScriptInstances(startParam, postOnRez, engine); part.CreateScriptInstances(startParam, postOnRez, engine,
stateSource);
} }
} }
} }
@ -277,5 +281,89 @@ namespace OpenSim.Region.Environment.Scenes
foreach (SceneObjectPart part in m_parts.Values) foreach (SceneObjectPart part in m_parts.Values)
part.ApplyNextOwnerPermissions(); part.ApplyNextOwnerPermissions();
} }
public string GetStateSnapshot()
{
List<string> assemblies = new List<string>();
Dictionary<UUID, string> states = new Dictionary<UUID, string>();
foreach (SceneObjectPart part in m_parts.Values)
{
foreach (string a in part.GetScriptAssemblies())
{
if (a != "" && !assemblies.Contains(a))
assemblies.Add(a);
}
foreach (KeyValuePair<UUID, string> s in part.GetScriptStates())
{
states[s.Key] = s.Value;
}
}
if (states.Count < 1 || assemblies.Count < 1)
return "";
XmlDocument xmldoc = new XmlDocument();
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
"", "");
xmldoc.AppendChild(xmlnode);
XmlElement rootElement = xmldoc.CreateElement("", "ScriptData",
"");
xmldoc.AppendChild(rootElement);
XmlElement wrapper = xmldoc.CreateElement("", "Assemblies",
"");
rootElement.AppendChild(wrapper);
foreach (string assembly in assemblies)
{
string fn = Path.GetFileName(assembly);
FileInfo fi = new FileInfo(assembly);
Byte[] data = new Byte[fi.Length];
FileStream fs = File.Open(assembly, FileMode.Open, FileAccess.Read);
fs.Read(data, 0, data.Length);
fs.Close();
XmlElement assemblyData = xmldoc.CreateElement("", "Assembly", "");
XmlAttribute assemblyName = xmldoc.CreateAttribute("", "Filename", "");
assemblyName.Value = fn;
assemblyData.Attributes.Append(assemblyName);
assemblyData.InnerText = System.Convert.ToBase64String(data);
wrapper.AppendChild(assemblyData);
}
wrapper = xmldoc.CreateElement("", "ScriptStates",
"");
rootElement.AppendChild(wrapper);
foreach (KeyValuePair<UUID, string> state in states)
{
XmlElement stateData = xmldoc.CreateElement("", "State", "");
XmlAttribute stateID = xmldoc.CreateAttribute("", "UUID", "");
stateID.Value = state.Key.ToString();
stateData.Attributes.Append(stateID);
XmlDocument sdoc = new XmlDocument();
sdoc.LoadXml(state.Value);
XmlNodeList rootL = sdoc.GetElementsByTagName("ScriptState");
XmlNode rootNode = rootL[0];
XmlNode newNode = xmldoc.ImportNode(rootNode, true);
stateData.AppendChild(newNode);
wrapper.AppendChild(stateData);
}
return xmldoc.InnerXml;
}
} }
} }

View File

@ -126,7 +126,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <summary> /// <summary>
/// Start all the scripts contained in this prim's inventory /// Start all the scripts contained in this prim's inventory
/// </summary> /// </summary>
public void CreateScriptInstances(int startParam, bool postOnRez, string engine) public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
{ {
lock (m_taskInventory) lock (m_taskInventory)
{ {
@ -134,7 +134,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if ((int)InventoryType.LSL == item.InvType) if ((int)InventoryType.LSL == item.InvType)
{ {
CreateScriptInstance(item, startParam, postOnRez, engine); CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
} }
} }
} }
@ -163,7 +163,7 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
/// <param name="item"></param> /// <param name="item"></param>
/// <returns></returns> /// <returns></returns>
public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine) public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource)
{ {
// m_log.InfoFormat( // m_log.InfoFormat(
// "[PRIM INVENTORY]: " + // "[PRIM INVENTORY]: " +
@ -194,7 +194,7 @@ namespace OpenSim.Region.Environment.Scenes
m_taskInventory[item.ItemID].PermsGranter = UUID.Zero; m_taskInventory[item.ItemID].PermsGranter = UUID.Zero;
string script = Utils.BytesToString(asset.Data); string script = Utils.BytesToString(asset.Data);
m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script, m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script,
startParam, postOnRez, engine); startParam, postOnRez, engine, stateSource);
m_parentGroup.AddActiveScriptCount(1); m_parentGroup.AddActiveScriptCount(1);
ScheduleFullUpdate(); ScheduleFullUpdate();
} }
@ -208,13 +208,13 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="itemId"> /// <param name="itemId">
/// A <see cref="UUID"/> /// A <see cref="UUID"/>
/// </param> /// </param>
public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine) public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
{ {
lock (m_taskInventory) lock (m_taskInventory)
{ {
if (m_taskInventory.ContainsKey(itemId)) if (m_taskInventory.ContainsKey(itemId))
{ {
CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez, engine); CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez, engine, stateSource);
} }
else else
{ {
@ -765,7 +765,7 @@ namespace OpenSim.Region.Environment.Scenes
return ret; return ret;
} }
string[] GetScriptAssemblies() public string[] GetScriptAssemblies()
{ {
IScriptModule[] engines = m_parentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); IScriptModule[] engines = m_parentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
@ -789,5 +789,29 @@ namespace OpenSim.Region.Environment.Scenes
} }
return ret.ToArray(); return ret.ToArray();
} }
public Dictionary<UUID, string> GetScriptStates()
{
IScriptModule[] engines = m_parentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
Dictionary<UUID, string> ret = new Dictionary<UUID, string>();
foreach (TaskInventoryItem item in m_taskInventory.Values)
{
if (item.InvType == 10)
{
foreach (IScriptModule e in engines)
{
string n = e.GetXMLState(item.ItemID);
if (n != "")
{
if (!ret.ContainsKey(item.ItemID))
ret[item.ItemID] = n;
break;
}
}
}
}
return ret;
}
} }
} }

View File

@ -232,7 +232,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
} }
public void OnRezScript(uint localID, UUID itemID, string script, public void OnRezScript(uint localID, UUID itemID, string script,
int startParam, bool postOnRez, string engine) int startParam, bool postOnRez, string engine, int stateSource)
{ {
List<IScriptModule> engines = List<IScriptModule> engines =
new List<IScriptModule>( new List<IScriptModule>(

View File

@ -39,8 +39,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
public enum StateSource public enum StateSource
{ {
NewRez = 0, NewRez = 0,
PrimCrossing = 1, PrimCrossing = 1
AttachmentCrossing = 2
} }
public interface IScriptWorkItem public interface IScriptWorkItem

View File

@ -286,6 +286,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
PostEvent(new EventParams("changed", PostEvent(new EventParams("changed",
new Object[] {new LSL_Types.LSLInteger(256)}, new DetectParams[0])); new Object[] {new LSL_Types.LSLInteger(256)}, new DetectParams[0]));
} }
else if (stateSource == StateSource.PrimCrossing)
{
// CHANGED_REGION
PostEvent(new EventParams("changed",
new Object[] {new LSL_Types.LSLInteger(512)}, new DetectParams[0]));
}
} }
} }
else else
@ -313,6 +319,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
} }
else else
{ {
ScenePresence presence = m_Engine.World.GetScenePresence(part.OwnerID);
if (presence != null && (!postOnRez))
presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
// m_Engine.Log.ErrorFormat("[Script] Unable to load script state, file not found"); // m_Engine.Log.ErrorFormat("[Script] Unable to load script state, file not found");
Start(); Start();
PostEvent(new EventParams("state_entry", PostEvent(new EventParams("state_entry",
@ -856,8 +867,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public string GetXMLState() public string GetXMLState()
{ {
bool run = Running;
Stop(100); Stop(100);
Running = run;
return ScriptSerializer.Serialize(this); return ScriptSerializer.Serialize(this);
Running = false;
} }
} }
} }

View File

@ -333,7 +333,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
get { return false; } get { return false; }
} }
public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource)
{ {
List<IScriptModule> engines = new List<IScriptModule>(m_Scene.RequestModuleInterfaces<IScriptModule>()); List<IScriptModule> engines = new List<IScriptModule>(m_Scene.RequestModuleInterfaces<IScriptModule>());
@ -388,7 +388,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
if (engine != ScriptEngineName) if (engine != ScriptEngineName)
return; return;
Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez}; Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez, (StateSource)stateSource};
lock (m_CompileQueue) lock (m_CompileQueue)
{ {
@ -471,6 +471,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
string script =(string)p[2]; string script =(string)p[2];
int startParam = (int)p[3]; int startParam = (int)p[3];
bool postOnRez = (bool)p[4]; bool postOnRez = (bool)p[4];
StateSource stateSource = (StateSource)p[5];
// Get the asset ID of the script, so we can check if we // Get the asset ID of the script, so we can check if we
// already have it. // already have it.
@ -505,8 +506,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
{ {
assembly = m_Compiler.PerformScriptCompile(script, assembly = m_Compiler.PerformScriptCompile(script,
assetID.ToString()); assetID.ToString());
if (presence != null && (!postOnRez))
presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
} }
catch (Exception e) catch (Exception e)
{ {
@ -584,7 +583,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_AppDomains[appDomain], m_AppDomains[appDomain],
part.ParentGroup.RootPart.Name, part.ParentGroup.RootPart.Name,
item.Name, startParam, postOnRez, item.Name, startParam, postOnRez,
StateSource.NewRez, m_MaxScriptQueue); stateSource, m_MaxScriptQueue);
m_log.DebugFormat("[XEngine] Loaded script {0}.{1}", m_log.DebugFormat("[XEngine] Loaded script {0}.{1}",
part.ParentGroup.RootPart.Name, item.Name); part.ParentGroup.RootPart.Name, item.Name);

View File

@ -77,7 +77,7 @@ namespace OpenSim.ScriptEngine.Components.DotNetEngine.Events
RemoveScript(localID, itemID); RemoveScript(localID, itemID);
} }
private void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) private void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource)
{ {
// New script being created, fire event // New script being created, fire event
if (RezScript != null) if (RezScript != null)