aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Scenes
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Environment/Scenes/EventManager.cs6
-rw-r--r--OpenSim/Region/Environment/Scenes/InnerScene.cs2
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.Inventory.cs14
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.cs3
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs92
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs38
6 files changed, 134 insertions, 21 deletions
diff --git a/OpenSim/Region/Environment/Scenes/EventManager.cs b/OpenSim/Region/Environment/Scenes/EventManager.cs
index 244b76f8..5d21dc5 100644
--- a/OpenSim/Region/Environment/Scenes/EventManager.cs
+++ b/OpenSim/Region/Environment/Scenes/EventManager.cs
@@ -104,7 +104,7 @@ namespace OpenSim.Region.Environment.Scenes
104 104
105 public event OnPermissionErrorDelegate OnPermissionError; 105 public event OnPermissionErrorDelegate OnPermissionError;
106 106
107 public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine); 107 public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource);
108 108
109 public event NewRezScript OnRezScript; 109 public event NewRezScript OnRezScript;
110 110
@@ -548,13 +548,13 @@ namespace OpenSim.Region.Environment.Scenes
548 } 548 }
549 } 549 }
550 550
551 public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) 551 public void TriggerRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource)
552 { 552 {
553 handlerRezScript = OnRezScript; 553 handlerRezScript = OnRezScript;
554 if (handlerRezScript != null) 554 if (handlerRezScript != null)
555 { 555 {
556 handlerRezScript(localID, itemID, script, startParam, 556 handlerRezScript(localID, itemID, script, startParam,
557 postOnRez, engine); 557 postOnRez, engine, stateSource);
558 } 558 }
559 } 559 }
560 560
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 0b24ce9..aca82c3 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -1667,7 +1667,7 @@ namespace OpenSim.Region.Environment.Scenes
1667 copy.UpdateGroupRotation(rot); 1667 copy.UpdateGroupRotation(rot);
1668 } 1668 }
1669 1669
1670 copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine); 1670 copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0);
1671 copy.HasGroupChanged = true; 1671 copy.HasGroupChanged = true;
1672 copy.ScheduleGroupForFullUpdate(); 1672 copy.ScheduleGroupForFullUpdate();
1673 return copy; 1673 return copy;
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index 4e93551..b0bac42 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -61,7 +61,7 @@ namespace OpenSim.Region.Environment.Scenes
61 { 61 {
62 if (group is SceneObjectGroup) 62 if (group is SceneObjectGroup)
63 { 63 {
64 ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine); 64 ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
65 } 65 }
66 } 66 }
67 } 67 }
@@ -292,7 +292,7 @@ namespace OpenSim.Region.Environment.Scenes
292 { 292 {
293 // Needs to determine which engine was running it and use that 293 // Needs to determine which engine was running it and use that
294 // 294 //
295 part.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine); 295 part.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0);
296 } 296 }
297 else 297 else
298 { 298 {
@@ -1343,7 +1343,7 @@ namespace OpenSim.Region.Environment.Scenes
1343 part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); 1343 part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID);
1344 // TODO: switch to posting on_rez here when scripts 1344 // TODO: switch to posting on_rez here when scripts
1345 // have state in inventory 1345 // have state in inventory
1346 part.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine); 1346 part.CreateScriptInstance(copyID, 0, false, DefaultScriptEngine, 0);
1347 1347
1348 // m_log.InfoFormat("[PRIMINVENTORY]: " + 1348 // m_log.InfoFormat("[PRIMINVENTORY]: " +
1349 // "Rezzed script {0} into prim local ID {1} for user {2}", 1349 // "Rezzed script {0} into prim local ID {1} for user {2}",
@@ -1407,7 +1407,7 @@ namespace OpenSim.Region.Environment.Scenes
1407 part.AddInventoryItem(taskItem); 1407 part.AddInventoryItem(taskItem);
1408 part.GetProperties(remoteClient); 1408 part.GetProperties(remoteClient);
1409 1409
1410 part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine); 1410 part.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
1411 } 1411 }
1412 } 1412 }
1413 1413
@@ -1503,7 +1503,7 @@ namespace OpenSim.Region.Environment.Scenes
1503 1503
1504 if (running > 0) 1504 if (running > 0)
1505 { 1505 {
1506 destPart.CreateScriptInstance(destTaskItem, 0, false, DefaultScriptEngine); 1506 destPart.CreateScriptInstance(destTaskItem, 0, false, DefaultScriptEngine, 0);
1507 } 1507 }
1508 1508
1509 ScenePresence avatar; 1509 ScenePresence avatar;
@@ -2050,7 +2050,7 @@ namespace OpenSim.Region.Environment.Scenes
2050 } 2050 }
2051 2051
2052 // Fire on_rez 2052 // Fire on_rez
2053 group.CreateScriptInstances(0, true, DefaultScriptEngine); 2053 group.CreateScriptInstances(0, true, DefaultScriptEngine, 0);
2054 2054
2055 if (!attachment) 2055 if (!attachment)
2056 rootPart.ScheduleFullUpdate(); 2056 rootPart.ScheduleFullUpdate();
@@ -2154,7 +2154,7 @@ namespace OpenSim.Region.Environment.Scenes
2154 group.UpdateGroupRotation(rot); 2154 group.UpdateGroupRotation(rot);
2155 //group.ApplyPhysics(m_physicalPrim); 2155 //group.ApplyPhysics(m_physicalPrim);
2156 group.Velocity = vel; 2156 group.Velocity = vel;
2157 group.CreateScriptInstances(param, true, DefaultScriptEngine); 2157 group.CreateScriptInstances(param, true, DefaultScriptEngine, 0);
2158 rootPart.ScheduleFullUpdate(); 2158 rootPart.ScheduleFullUpdate();
2159 2159
2160 if (!ExternalChecks.ExternalChecksBypassPermissions()) 2160 if (!ExternalChecks.ExternalChecksBypassPermissions())
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 70ea709..62e6691 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -30,6 +30,7 @@ using System.Collections.Generic;
30using System.Drawing; 30using System.Drawing;
31using System.Drawing.Imaging; 31using System.Drawing.Imaging;
32using System.IO; 32using System.IO;
33using System.Xml;
33using System.Threading; 34using System.Threading;
34using System.Timers; 35using System.Timers;
35using OpenMetaverse; 36using OpenMetaverse;
@@ -591,7 +592,7 @@ namespace OpenSim.Region.Environment.Scenes
591 { 592 {
592 if (ent is SceneObjectGroup) 593 if (ent is SceneObjectGroup)
593 { 594 {
594 ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine); 595 ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
595 } 596 }
596 } 597 }
597 } 598 }
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
index 24ebc48..a4801ad 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs
@@ -26,11 +26,14 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.IO;
29using System.Reflection; 30using System.Reflection;
30using OpenMetaverse; 31using OpenMetaverse;
31using log4net; 32using log4net;
32using OpenSim.Framework; 33using OpenSim.Framework;
33using OpenSim.Region.Environment.Interfaces; 34using OpenSim.Region.Environment.Interfaces;
35using System.Collections.Generic;
36using System.Xml;
34 37
35namespace OpenSim.Region.Environment.Scenes 38namespace OpenSim.Region.Environment.Scenes
36{ 39{
@@ -56,14 +59,15 @@ namespace OpenSim.Region.Environment.Scenes
56 /// Start the scripts contained in all the prims in this group. 59 /// Start the scripts contained in all the prims in this group.
57 /// </summary> 60 /// </summary>
58 public void CreateScriptInstances(int startParam, bool postOnRez, 61 public void CreateScriptInstances(int startParam, bool postOnRez,
59 string engine) 62 string engine, int stateSource)
60 { 63 {
61 // Don't start scripts if they're turned off in the region! 64 // Don't start scripts if they're turned off in the region!
62 if (!m_scene.RegionInfo.RegionSettings.DisableScripts) 65 if (!m_scene.RegionInfo.RegionSettings.DisableScripts)
63 { 66 {
64 foreach (SceneObjectPart part in m_parts.Values) 67 foreach (SceneObjectPart part in m_parts.Values)
65 { 68 {
66 part.CreateScriptInstances(startParam, postOnRez, engine); 69 part.CreateScriptInstances(startParam, postOnRez, engine,
70 stateSource);
67 } 71 }
68 } 72 }
69 } 73 }
@@ -277,5 +281,89 @@ namespace OpenSim.Region.Environment.Scenes
277 foreach (SceneObjectPart part in m_parts.Values) 281 foreach (SceneObjectPart part in m_parts.Values)
278 part.ApplyNextOwnerPermissions(); 282 part.ApplyNextOwnerPermissions();
279 } 283 }
284
285 public string GetStateSnapshot()
286 {
287 List<string> assemblies = new List<string>();
288 Dictionary<UUID, string> states = new Dictionary<UUID, string>();
289
290 foreach (SceneObjectPart part in m_parts.Values)
291 {
292 foreach (string a in part.GetScriptAssemblies())
293 {
294 if (a != "" && !assemblies.Contains(a))
295 assemblies.Add(a);
296 }
297
298 foreach (KeyValuePair<UUID, string> s in part.GetScriptStates())
299 {
300 states[s.Key] = s.Value;
301 }
302 }
303
304 if (states.Count < 1 || assemblies.Count < 1)
305 return "";
306
307 XmlDocument xmldoc = new XmlDocument();
308
309 XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration,
310 "", "");
311
312 xmldoc.AppendChild(xmlnode);
313 XmlElement rootElement = xmldoc.CreateElement("", "ScriptData",
314 "");
315
316 xmldoc.AppendChild(rootElement);
317
318 XmlElement wrapper = xmldoc.CreateElement("", "Assemblies",
319 "");
320
321 rootElement.AppendChild(wrapper);
322
323 foreach (string assembly in assemblies)
324 {
325 string fn = Path.GetFileName(assembly);
326 FileInfo fi = new FileInfo(assembly);
327 Byte[] data = new Byte[fi.Length];
328
329 FileStream fs = File.Open(assembly, FileMode.Open, FileAccess.Read);
330 fs.Read(data, 0, data.Length);
331 fs.Close();
332
333 XmlElement assemblyData = xmldoc.CreateElement("", "Assembly", "");
334 XmlAttribute assemblyName = xmldoc.CreateAttribute("", "Filename", "");
335 assemblyName.Value = fn;
336 assemblyData.Attributes.Append(assemblyName);
337
338 assemblyData.InnerText = System.Convert.ToBase64String(data);
339
340 wrapper.AppendChild(assemblyData);
341 }
342
343 wrapper = xmldoc.CreateElement("", "ScriptStates",
344 "");
345
346 rootElement.AppendChild(wrapper);
347
348 foreach (KeyValuePair<UUID, string> state in states)
349 {
350 XmlElement stateData = xmldoc.CreateElement("", "State", "");
351
352 XmlAttribute stateID = xmldoc.CreateAttribute("", "UUID", "");
353 stateID.Value = state.Key.ToString();
354 stateData.Attributes.Append(stateID);
355
356 XmlDocument sdoc = new XmlDocument();
357 sdoc.LoadXml(state.Value);
358 XmlNodeList rootL = sdoc.GetElementsByTagName("ScriptState");
359 XmlNode rootNode = rootL[0];
360
361 XmlNode newNode = xmldoc.ImportNode(rootNode, true);
362 stateData.AppendChild(newNode);
363 wrapper.AppendChild(stateData);
364 }
365
366 return xmldoc.InnerXml;
367 }
280 } 368 }
281} 369}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
index 2f08322..501f199 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
@@ -126,7 +126,7 @@ namespace OpenSim.Region.Environment.Scenes
126 /// <summary> 126 /// <summary>
127 /// Start all the scripts contained in this prim's inventory 127 /// Start all the scripts contained in this prim's inventory
128 /// </summary> 128 /// </summary>
129 public void CreateScriptInstances(int startParam, bool postOnRez, string engine) 129 public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
130 { 130 {
131 lock (m_taskInventory) 131 lock (m_taskInventory)
132 { 132 {
@@ -134,7 +134,7 @@ namespace OpenSim.Region.Environment.Scenes
134 { 134 {
135 if ((int)InventoryType.LSL == item.InvType) 135 if ((int)InventoryType.LSL == item.InvType)
136 { 136 {
137 CreateScriptInstance(item, startParam, postOnRez, engine); 137 CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
138 } 138 }
139 } 139 }
140 } 140 }
@@ -163,7 +163,7 @@ namespace OpenSim.Region.Environment.Scenes
163 /// </summary> 163 /// </summary>
164 /// <param name="item"></param> 164 /// <param name="item"></param>
165 /// <returns></returns> 165 /// <returns></returns>
166 public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine) 166 public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez, string engine, int stateSource)
167 { 167 {
168 // m_log.InfoFormat( 168 // m_log.InfoFormat(
169 // "[PRIM INVENTORY]: " + 169 // "[PRIM INVENTORY]: " +
@@ -194,7 +194,7 @@ namespace OpenSim.Region.Environment.Scenes
194 m_taskInventory[item.ItemID].PermsGranter = UUID.Zero; 194 m_taskInventory[item.ItemID].PermsGranter = UUID.Zero;
195 string script = Utils.BytesToString(asset.Data); 195 string script = Utils.BytesToString(asset.Data);
196 m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script, 196 m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId, item.ItemID, script,
197 startParam, postOnRez, engine); 197 startParam, postOnRez, engine, stateSource);
198 m_parentGroup.AddActiveScriptCount(1); 198 m_parentGroup.AddActiveScriptCount(1);
199 ScheduleFullUpdate(); 199 ScheduleFullUpdate();
200 } 200 }
@@ -208,13 +208,13 @@ namespace OpenSim.Region.Environment.Scenes
208 /// <param name="itemId"> 208 /// <param name="itemId">
209 /// A <see cref="UUID"/> 209 /// A <see cref="UUID"/>
210 /// </param> 210 /// </param>
211 public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine) 211 public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
212 { 212 {
213 lock (m_taskInventory) 213 lock (m_taskInventory)
214 { 214 {
215 if (m_taskInventory.ContainsKey(itemId)) 215 if (m_taskInventory.ContainsKey(itemId))
216 { 216 {
217 CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez, engine); 217 CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez, engine, stateSource);
218 } 218 }
219 else 219 else
220 { 220 {
@@ -765,7 +765,7 @@ namespace OpenSim.Region.Environment.Scenes
765 return ret; 765 return ret;
766 } 766 }
767 767
768 string[] GetScriptAssemblies() 768 public string[] GetScriptAssemblies()
769 { 769 {
770 IScriptModule[] engines = m_parentGroup.Scene.RequestModuleInterfaces<IScriptModule>(); 770 IScriptModule[] engines = m_parentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
771 771
@@ -789,5 +789,29 @@ namespace OpenSim.Region.Environment.Scenes
789 } 789 }
790 return ret.ToArray(); 790 return ret.ToArray();
791 } 791 }
792
793 public Dictionary<UUID, string> GetScriptStates()
794 {
795 IScriptModule[] engines = m_parentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
796 Dictionary<UUID, string> ret = new Dictionary<UUID, string>();
797
798 foreach (TaskInventoryItem item in m_taskInventory.Values)
799 {
800 if (item.InvType == 10)
801 {
802 foreach (IScriptModule e in engines)
803 {
804 string n = e.GetXMLState(item.ItemID);
805 if (n != "")
806 {
807 if (!ret.ContainsKey(item.ItemID))
808 ret[item.ItemID] = n;
809 break;
810 }
811 }
812 }
813 }
814 return ret;
815 }
792 } 816 }
793} 817}