aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--[-rwxr-xr-x]OpenSim/Region/Application/OpenSim.cs5
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs105
-rw-r--r--OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs3
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs57
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs1
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs5
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs46
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs19
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs17
-rw-r--r--OpenSim/Region/DataSnapshot/DataSnapshotManager.cs6
-rw-r--r--OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs29
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEntityInventory.cs1
-rw-r--r--OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs12
-rw-r--r--OpenSim/Region/Framework/Interfaces/IScriptModule.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs59
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs18
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs5
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs87
-rw-r--r--OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs1
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs2
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs9
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs14
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs18
27 files changed, 377 insertions, 165 deletions
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index 38b2084..1395030 100755..100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -251,8 +251,9 @@ namespace OpenSim
251 "Save named prim to XML2", SavePrimsXml2); 251 "Save named prim to XML2", SavePrimsXml2);
252 252
253 m_console.Commands.AddCommand("region", false, "load oar", 253 m_console.Commands.AddCommand("region", false, "load oar",
254 "load oar [--merge] <oar name>", 254 "load oar [--merge] [--skip-assets] <oar name>",
255 "Load a region's data from OAR archive", LoadOar); 255 "Load a region's data from OAR archive. --merge will merge the oar with the existing scene. --skip-assets will load the oar but ignore the assets it contains",
256 LoadOar);
256 257
257 m_console.Commands.AddCommand("region", false, "save oar", 258 m_console.Commands.AddCommand("region", false, "save oar",
258 "save oar <oar name>", 259 "save oar <oar name>",
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index b3f5f09..d7120a5 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -7091,32 +7091,90 @@ namespace OpenSim.Region.ClientStack.LindenUDP
7091 taskID = new UUID(transfer.TransferInfo.Params, 48); 7091 taskID = new UUID(transfer.TransferInfo.Params, 48);
7092 UUID itemID = new UUID(transfer.TransferInfo.Params, 64); 7092 UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
7093 UUID requestID = new UUID(transfer.TransferInfo.Params, 80); 7093 UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
7094
7095// m_log.DebugFormat(
7096// "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}",
7097// requestID, itemID, taskID, Name);
7098
7094 if (!(((Scene)m_scene).Permissions.BypassPermissions())) 7099 if (!(((Scene)m_scene).Permissions.BypassPermissions()))
7095 { 7100 {
7096 if (taskID != UUID.Zero) // Prim 7101 if (taskID != UUID.Zero) // Prim
7097 { 7102 {
7098 SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID); 7103 SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
7104
7099 if (part == null) 7105 if (part == null)
7106 {
7107 m_log.WarnFormat(
7108 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist",
7109 Name, requestID, itemID, taskID);
7100 return true; 7110 return true;
7111 }
7101 7112
7102 if (part.OwnerID != AgentId) 7113 TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID);
7103 return true; 7114 if (tii == null)
7104 7115 {
7105 if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) 7116 m_log.WarnFormat(
7106 return true; 7117 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist",
7107 7118 Name, requestID, itemID, taskID);
7108 TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID);
7109 if (ti == null)
7110 return true;
7111
7112 if (ti.OwnerID != AgentId)
7113 return true;
7114
7115 if ((ti.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
7116 return true;
7117
7118 if (ti.AssetID != requestID)
7119 return true; 7119 return true;
7120 }
7121
7122 if (tii.Type == (int)AssetType.LSLText)
7123 {
7124 if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId))
7125 return true;
7126 }
7127 else if (tii.Type == (int)AssetType.Notecard)
7128 {
7129 if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId))
7130 return true;
7131 }
7132 else
7133 {
7134 // TODO: Change this code to allow items other than notecards and scripts to be successfully
7135 // shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule
7136 if (part.OwnerID != AgentId)
7137 {
7138 m_log.WarnFormat(
7139 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}",
7140 Name, requestID, itemID, taskID, part.OwnerID);
7141 return true;
7142 }
7143
7144 if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
7145 {
7146 m_log.WarnFormat(
7147 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set",
7148 Name, requestID, itemID, taskID);
7149 return true;
7150 }
7151
7152 if (tii.OwnerID != AgentId)
7153 {
7154 m_log.WarnFormat(
7155 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}",
7156 Name, requestID, itemID, taskID, tii.OwnerID);
7157 return true;
7158 }
7159
7160 if ((
7161 tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
7162 != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
7163 {
7164 m_log.WarnFormat(
7165 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer",
7166 Name, requestID, itemID, taskID);
7167 return true;
7168 }
7169
7170 if (tii.AssetID != requestID)
7171 {
7172 m_log.WarnFormat(
7173 "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}",
7174 Name, requestID, itemID, taskID, tii.AssetID);
7175 return true;
7176 }
7177 }
7120 } 7178 }
7121 else // Agent 7179 else // Agent
7122 { 7180 {
@@ -7136,7 +7194,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
7136 // only to notecards and scripts. All 7194 // only to notecards and scripts. All
7137 // other asset types are always available 7195 // other asset types are always available
7138 // 7196 //
7139 if (assetRequestItem.AssetType == 10) 7197 if (assetRequestItem.AssetType == (int)AssetType.LSLText)
7140 { 7198 {
7141 if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId)) 7199 if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId))
7142 { 7200 {
@@ -7144,7 +7202,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
7144 return true; 7202 return true;
7145 } 7203 }
7146 } 7204 }
7147 else if (assetRequestItem.AssetType == 7) 7205 else if (assetRequestItem.AssetType == (int)AssetType.Notecard)
7148 { 7206 {
7149 if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId)) 7207 if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId))
7150 { 7208 {
@@ -7154,7 +7212,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
7154 } 7212 }
7155 7213
7156 if (assetRequestItem.AssetID != requestID) 7214 if (assetRequestItem.AssetID != requestID)
7215 {
7216 m_log.WarnFormat(
7217 "[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}",
7218 Name, requestID, itemID, assetRequestItem.AssetID);
7157 return true; 7219 return true;
7220 }
7158 } 7221 }
7159 } 7222 }
7160 } 7223 }
@@ -11389,7 +11452,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11389 // } 11452 // }
11390 } 11453 }
11391 11454
11392 //m_log.DebugFormat("[LLCLIENTVIEW]: {0} requesting asset {1}", Name, requestID); 11455// m_log.DebugFormat("[CLIENT]: {0} requesting asset {1}", Name, requestID);
11393 11456
11394 m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived); 11457 m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived);
11395 } 11458 }
@@ -11757,4 +11820,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP
11757 OutPacket(dialog, ThrottleOutPacketType.Task); 11820 OutPacket(dialog, ThrottleOutPacketType.Task);
11758 } 11821 }
11759 } 11822 }
11760} 11823} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
index 012d581..d30e954 100644
--- a/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
+++ b/OpenSim/Region/CoreModules/Agent/AssetTransaction/AgentAssetsTransactions.cs
@@ -181,7 +181,10 @@ namespace OpenSim.Region.CoreModules.Agent.AssetTransaction
181 Manager.MyScene.AssetService.Store(asset); 181 Manager.MyScene.AssetService.Store(asset);
182 182
183 if (part.Inventory.UpdateInventoryItem(item)) 183 if (part.Inventory.UpdateInventoryItem(item))
184 {
185 remoteClient.SendAgentAlertMessage("Notecard saved", false);
184 part.GetProperties(remoteClient); 186 part.GetProperties(remoteClient);
187 }
185 } 188 }
186 } 189 }
187 } 190 }
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 23828ef..f050dcf 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -30,6 +30,7 @@ using System.Reflection;
30using log4net; 30using log4net;
31using Nini.Config; 31using Nini.Config;
32using OpenMetaverse; 32using OpenMetaverse;
33using OpenMetaverse.Packets;
33using OpenSim.Framework; 34using OpenSim.Framework;
34using OpenSim.Region.Framework; 35using OpenSim.Region.Framework;
35using OpenSim.Region.Framework.Interfaces; 36using OpenSim.Region.Framework.Interfaces;
@@ -169,6 +170,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
169 return true; 170 return true;
170 } 171 }
171 172
173 public void RezMultipleAttachmentsFromInventory(
174 IClientAPI remoteClient,
175 RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
176 RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects)
177 {
178 foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects)
179 {
180 RezSingleAttachmentFromInventory(remoteClient, obj.ItemID, obj.AttachmentPt);
181 }
182 }
183
172 public UUID RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) 184 public UUID RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
173 { 185 {
174 m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing single attachment from item {0} for {1}", itemID, remoteClient.Name); 186 m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing single attachment from item {0} for {1}", itemID, remoteClient.Name);
@@ -227,6 +239,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
227 // Fire after attach, so we don't get messy perms dialogs 239 // Fire after attach, so we don't get messy perms dialogs
228 // 3 == AttachedRez 240 // 3 == AttachedRez
229 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 3); 241 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 3);
242 objatt.ResumeScripts();
230 243
231 // Do this last so that event listeners have access to all the effects of the attachment 244 // Do this last so that event listeners have access to all the effects of the attachment
232 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId); 245 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId);
@@ -311,6 +324,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
311 } 324 }
312 } 325 }
313 326
327 public void DetachObject(uint objectLocalID, IClientAPI remoteClient)
328 {
329 SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID);
330 if (group != null)
331 {
332 //group.DetachToGround();
333 ShowDetachInUserInventory(group.GetFromItemID(), remoteClient);
334 }
335 }
336
314 public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient) 337 public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient)
315 { 338 {
316 ScenePresence presence; 339 ScenePresence presence;
@@ -329,6 +352,38 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
329 DetachSingleAttachmentToInv(itemID, remoteClient); 352 DetachSingleAttachmentToInv(itemID, remoteClient);
330 } 353 }
331 354
355 public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient)
356 {
357 SceneObjectPart part = m_scene.GetSceneObjectPart(itemID);
358 if (part == null || part.ParentGroup == null)
359 return;
360
361 UUID inventoryID = part.ParentGroup.GetFromItemID();
362
363 ScenePresence presence;
364 if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence))
365 {
366 if (!m_scene.Permissions.CanRezObject(
367 part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition))
368 return;
369
370 presence.Appearance.DetachAttachment(itemID);
371
372 if (m_scene.AvatarFactory != null)
373 {
374 m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
375 }
376 part.ParentGroup.DetachToGround();
377
378 List<UUID> uuids = new List<UUID>();
379 uuids.Add(inventoryID);
380 m_scene.InventoryService.DeleteItems(remoteClient.AgentId, uuids);
381 remoteClient.SendRemoveInventoryItem(inventoryID);
382 }
383
384 m_scene.EventManager.TriggerOnAttach(part.ParentGroup.LocalId, itemID, UUID.Zero);
385 }
386
332 // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. 387 // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards.
333 // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? 388 // To LocalId or UUID, *THAT* is the question. How now Brown UUID??
334 protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) 389 protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient)
@@ -359,4 +414,4 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
359 } 414 }
360 } 415 }
361 } 416 }
362} \ No newline at end of file 417}
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 16e05b7..2352ced 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -601,6 +601,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
601 601
602 // Fire on_rez 602 // Fire on_rez
603 group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0); 603 group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0);
604 rootPart.ParentGroup.ResumeScripts();
604 605
605 rootPart.ScheduleFullUpdate(); 606 rootPart.ScheduleFullUpdate();
606 } 607 }
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
index e97d21f..a2f26d5 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/LocalInventoryServiceConnector.cs
@@ -311,10 +311,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory
311 { 311 {
312// m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID); 312// m_log.DebugFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Requesting inventory item {0}", item.ID);
313 313
314 UUID requestedItemId = item.ID;
315
314 item = m_InventoryService.GetItem(item); 316 item = m_InventoryService.GetItem(item);
315 317
316 if (null == item) 318 if (null == item)
317 m_log.ErrorFormat("[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", item.ID); 319 m_log.ErrorFormat(
320 "[LOCAL INVENTORY SERVICES CONNECTOR]: Could not find item with id {0}", requestedItemId);
318 321
319 return item; 322 return item;
320 } 323 }
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index b1b2336f8..c52f029 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -53,25 +53,27 @@ namespace OpenSim.Region.CoreModules.World.Archiver
53 { 53 {
54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 54 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
55 55
56 private static ASCIIEncoding m_asciiEncoding = new ASCIIEncoding(); 56 protected Scene m_scene;
57 private static UTF8Encoding m_utf8Encoding = new UTF8Encoding(); 57 protected Stream m_loadStream;
58 58 protected Guid m_requestId;
59 private Scene m_scene; 59 protected string m_errorMessage;
60 private Stream m_loadStream;
61 private Guid m_requestId;
62 private string m_errorMessage;
63 60
64 /// <value> 61 /// <value>
65 /// Should the archive being loaded be merged with what is already on the region? 62 /// Should the archive being loaded be merged with what is already on the region?
66 /// </value> 63 /// </value>
67 private bool m_merge; 64 protected bool m_merge;
65
66 /// <value>
67 /// Should we ignore any assets when reloading the archive?
68 /// </value>
69 protected bool m_skipAssets;
68 70
69 /// <summary> 71 /// <summary>
70 /// Used to cache lookups for valid uuids. 72 /// Used to cache lookups for valid uuids.
71 /// </summary> 73 /// </summary>
72 private IDictionary<UUID, bool> m_validUserUuids = new Dictionary<UUID, bool>(); 74 private IDictionary<UUID, bool> m_validUserUuids = new Dictionary<UUID, bool>();
73 75
74 public ArchiveReadRequest(Scene scene, string loadPath, bool merge, Guid requestId) 76 public ArchiveReadRequest(Scene scene, string loadPath, bool merge, bool skipAssets, Guid requestId)
75 { 77 {
76 m_scene = scene; 78 m_scene = scene;
77 79
@@ -89,14 +91,16 @@ namespace OpenSim.Region.CoreModules.World.Archiver
89 91
90 m_errorMessage = String.Empty; 92 m_errorMessage = String.Empty;
91 m_merge = merge; 93 m_merge = merge;
94 m_skipAssets = skipAssets;
92 m_requestId = requestId; 95 m_requestId = requestId;
93 } 96 }
94 97
95 public ArchiveReadRequest(Scene scene, Stream loadStream, bool merge, Guid requestId) 98 public ArchiveReadRequest(Scene scene, Stream loadStream, bool merge, bool skipAssets, Guid requestId)
96 { 99 {
97 m_scene = scene; 100 m_scene = scene;
98 m_loadStream = loadStream; 101 m_loadStream = loadStream;
99 m_merge = merge; 102 m_merge = merge;
103 m_skipAssets = skipAssets;
100 m_requestId = requestId; 104 m_requestId = requestId;
101 } 105 }
102 106
@@ -133,9 +137,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver
133 137
134 if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH)) 138 if (filePath.StartsWith(ArchiveConstants.OBJECTS_PATH))
135 { 139 {
136 serialisedSceneObjects.Add(m_utf8Encoding.GetString(data)); 140 serialisedSceneObjects.Add(Encoding.UTF8.GetString(data));
137 } 141 }
138 else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH)) 142 else if (filePath.StartsWith(ArchiveConstants.ASSETS_PATH) && !m_skipAssets)
139 { 143 {
140 if (LoadAsset(filePath, data)) 144 if (LoadAsset(filePath, data))
141 successfulAssetRestores++; 145 successfulAssetRestores++;
@@ -155,7 +159,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
155 } 159 }
156 else if (!m_merge && filePath.StartsWith(ArchiveConstants.LANDDATA_PATH)) 160 else if (!m_merge && filePath.StartsWith(ArchiveConstants.LANDDATA_PATH))
157 { 161 {
158 serialisedParcels.Add(m_utf8Encoding.GetString(data)); 162 serialisedParcels.Add(Encoding.UTF8.GetString(data));
159 } 163 }
160 else if (filePath == ArchiveConstants.CONTROL_FILE_PATH) 164 else if (filePath == ArchiveConstants.CONTROL_FILE_PATH)
161 { 165 {
@@ -178,12 +182,15 @@ namespace OpenSim.Region.CoreModules.World.Archiver
178 archive.Close(); 182 archive.Close();
179 } 183 }
180 184
181 m_log.InfoFormat("[ARCHIVER]: Restored {0} assets", successfulAssetRestores); 185 if (!m_skipAssets)
182
183 if (failedAssetRestores > 0)
184 { 186 {
185 m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores); 187 m_log.InfoFormat("[ARCHIVER]: Restored {0} assets", successfulAssetRestores);
186 m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores); 188
189 if (failedAssetRestores > 0)
190 {
191 m_log.ErrorFormat("[ARCHIVER]: Failed to load {0} assets", failedAssetRestores);
192 m_errorMessage += String.Format("Failed to load {0} assets", failedAssetRestores);
193 }
187 } 194 }
188 195
189 if (!m_merge) 196 if (!m_merge)
@@ -277,6 +284,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
277 { 284 {
278 sceneObjectsLoadedCount++; 285 sceneObjectsLoadedCount++;
279 sceneObject.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, 0); 286 sceneObject.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, 0);
287 sceneObject.ResumeScripts();
280 } 288 }
281 } 289 }
282 290
@@ -541,7 +549,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
541 XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None); 549 XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);
542 550
543 XmlTextReader xtr 551 XmlTextReader xtr
544 = new XmlTextReader(m_asciiEncoding.GetString(data), XmlNodeType.Document, context); 552 = new XmlTextReader(Encoding.ASCII.GetString(data), XmlNodeType.Document, context);
545 553
546 RegionSettings currentRegionSettings = m_scene.RegionInfo.RegionSettings; 554 RegionSettings currentRegionSettings = m_scene.RegionInfo.RegionSettings;
547 555
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
index fc8d4e1..82ede01 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiverModule.cs
@@ -94,8 +94,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
94 public void HandleLoadOarConsoleCommand(string module, string[] cmdparams) 94 public void HandleLoadOarConsoleCommand(string module, string[] cmdparams)
95 { 95 {
96 bool mergeOar = false; 96 bool mergeOar = false;
97 bool skipAssets = false;
97 98
98 OptionSet options = new OptionSet().Add("m|merge", delegate (string v) { mergeOar = v != null; }); 99 OptionSet options = new OptionSet().Add("m|merge", delegate (string v) { mergeOar = v != null; });
100 options.Add("s|skip-assets", delegate (string v) { skipAssets = v != null; });
101
99 List<string> mainParams = options.Parse(cmdparams); 102 List<string> mainParams = options.Parse(cmdparams);
100 103
101// m_log.DebugFormat("MERGE OAR IS [{0}]", mergeOar); 104// m_log.DebugFormat("MERGE OAR IS [{0}]", mergeOar);
@@ -105,11 +108,11 @@ namespace OpenSim.Region.CoreModules.World.Archiver
105 108
106 if (mainParams.Count > 2) 109 if (mainParams.Count > 2)
107 { 110 {
108 DearchiveRegion(mainParams[2], mergeOar, Guid.Empty); 111 DearchiveRegion(mainParams[2], mergeOar, skipAssets, Guid.Empty);
109 } 112 }
110 else 113 else
111 { 114 {
112 DearchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, mergeOar, Guid.Empty); 115 DearchiveRegion(DEFAULT_OAR_BACKUP_FILENAME, mergeOar, skipAssets, Guid.Empty);
113 } 116 }
114 } 117 }
115 118
@@ -154,25 +157,25 @@ namespace OpenSim.Region.CoreModules.World.Archiver
154 157
155 public void DearchiveRegion(string loadPath) 158 public void DearchiveRegion(string loadPath)
156 { 159 {
157 DearchiveRegion(loadPath, false, Guid.Empty); 160 DearchiveRegion(loadPath, false, false, Guid.Empty);
158 } 161 }
159 162
160 public void DearchiveRegion(string loadPath, bool merge, Guid requestId) 163 public void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId)
161 { 164 {
162 m_log.InfoFormat( 165 m_log.InfoFormat(
163 "[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath); 166 "[ARCHIVER]: Loading archive to region {0} from {1}", m_scene.RegionInfo.RegionName, loadPath);
164 167
165 new ArchiveReadRequest(m_scene, loadPath, merge, requestId).DearchiveRegion(); 168 new ArchiveReadRequest(m_scene, loadPath, merge, skipAssets, requestId).DearchiveRegion();
166 } 169 }
167 170
168 public void DearchiveRegion(Stream loadStream) 171 public void DearchiveRegion(Stream loadStream)
169 { 172 {
170 DearchiveRegion(loadStream, false, Guid.Empty); 173 DearchiveRegion(loadStream, false, false, Guid.Empty);
171 } 174 }
172 175
173 public void DearchiveRegion(Stream loadStream, bool merge, Guid requestId) 176 public void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId)
174 { 177 {
175 new ArchiveReadRequest(m_scene, loadStream, merge, requestId).DearchiveRegion(); 178 new ArchiveReadRequest(m_scene, loadStream, merge, skipAssets, requestId).DearchiveRegion();
176 } 179 }
177 } 180 }
178} 181}
diff --git a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
index de16d89..624dc22 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/Tests/ArchiverTests.cs
@@ -442,7 +442,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver.Tests
442 byte[] archive = archiveWriteStream.ToArray(); 442 byte[] archive = archiveWriteStream.ToArray();
443 MemoryStream archiveReadStream = new MemoryStream(archive); 443 MemoryStream archiveReadStream = new MemoryStream(archive);
444 444
445 m_archiverModule.DearchiveRegion(archiveReadStream, true, Guid.Empty); 445 m_archiverModule.DearchiveRegion(archiveReadStream, true, false, Guid.Empty);
446 446
447 SceneObjectPart object1Existing = m_scene.GetSceneObjectPart(part1.Name); 447 SceneObjectPart object1Existing = m_scene.GetSceneObjectPart(part1.Name);
448 Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge"); 448 Assert.That(object1Existing, Is.Not.Null, "object1 was not present after merge");
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index d940564..01359f0 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -1079,7 +1079,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions
1079 1079
1080 if ((part.GroupMask & (uint)PermissionMask.Modify) == 0) 1080 if ((part.GroupMask & (uint)PermissionMask.Modify) == 0)
1081 return false; 1081 return false;
1082 } else { 1082 }
1083 else
1084 {
1083 if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) 1085 if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
1084 return false; 1086 return false;
1085 } 1087 }
@@ -1095,7 +1097,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
1095 return false; 1097 return false;
1096 1098
1097 if (!IsGroupMember(ti.GroupID, user, 0)) 1099 if (!IsGroupMember(ti.GroupID, user, 0))
1098 return false; 1100 return false;
1099 } 1101 }
1100 1102
1101 // Require full perms 1103 // Require full perms
@@ -1593,14 +1595,16 @@ namespace OpenSim.Region.CoreModules.World.Permissions
1593 if (part.OwnerID != user) 1595 if (part.OwnerID != user)
1594 { 1596 {
1595 if (part.GroupID == UUID.Zero) 1597 if (part.GroupID == UUID.Zero)
1596 return false; 1598 return false;
1597 1599
1598 if (!IsGroupMember(part.GroupID, user, 0)) 1600 if (!IsGroupMember(part.GroupID, user, 0))
1599 return false; 1601 return false;
1600 1602
1601 if ((part.GroupMask & (uint)PermissionMask.Modify) == 0) 1603 if ((part.GroupMask & (uint)PermissionMask.Modify) == 0)
1602 return false; 1604 return false;
1603 } else { 1605 }
1606 else
1607 {
1604 if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0) 1608 if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
1605 return false; 1609 return false;
1606 } 1610 }
@@ -1855,7 +1859,8 @@ namespace OpenSim.Region.CoreModules.World.Permissions
1855 return GenericObjectPermission(agentID, prim, false); 1859 return GenericObjectPermission(agentID, prim, false);
1856 } 1860 }
1857 1861
1858 private bool CanCompileScript(UUID ownerUUID, int scriptType, Scene scene) { 1862 private bool CanCompileScript(UUID ownerUUID, int scriptType, Scene scene)
1863 {
1859 //m_log.DebugFormat("check if {0} is allowed to compile {1}", ownerUUID, scriptType); 1864 //m_log.DebugFormat("check if {0} is allowed to compile {1}", ownerUUID, scriptType);
1860 switch (scriptType) { 1865 switch (scriptType) {
1861 case 0: 1866 case 0:
@@ -1889,4 +1894,4 @@ namespace OpenSim.Region.CoreModules.World.Permissions
1889 return(false); 1894 return(false);
1890 } 1895 }
1891 } 1896 }
1892} 1897} \ No newline at end of file
diff --git a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs
index 6949d7c..9fc002b 100644
--- a/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs
+++ b/OpenSim/Region/DataSnapshot/DataSnapshotManager.cs
@@ -94,7 +94,7 @@ namespace OpenSim.Region.DataSnapshot
94 if (!m_configLoaded) 94 if (!m_configLoaded)
95 { 95 {
96 m_configLoaded = true; 96 m_configLoaded = true;
97 m_log.Info("[DATASNAPSHOT]: Loading configuration"); 97 //m_log.Debug("[DATASNAPSHOT]: Loading configuration");
98 //Read from the config for options 98 //Read from the config for options
99 lock (m_syncInit) 99 lock (m_syncInit)
100 { 100 {
@@ -123,7 +123,7 @@ namespace OpenSim.Region.DataSnapshot
123 } 123 }
124 catch (Exception) 124 catch (Exception)
125 { 125 {
126 m_log.Info("[DATASNAPSHOT]: Could not load configuration. DataSnapshot will be disabled."); 126 m_log.Warn("[DATASNAPSHOT]: Could not load configuration. DataSnapshot will be disabled.");
127 m_enabled = false; 127 m_enabled = false;
128 return; 128 return;
129 } 129 }
@@ -179,7 +179,7 @@ namespace OpenSim.Region.DataSnapshot
179 } 179 }
180 else 180 else
181 { 181 {
182 m_log.Warn("[DATASNAPSHOT]: Data snapshot disabled, not adding scene to module (or anything else)."); 182 //m_log.Debug("[DATASNAPSHOT]: Data snapshot disabled, not adding scene to module (or anything else).");
183 } 183 }
184 } 184 }
185 185
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index 0222b02..f8af367 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using OpenMetaverse; 29using OpenMetaverse;
30using OpenMetaverse.Packets;
30using OpenSim.Framework; 31using OpenSim.Framework;
31using OpenSim.Region.Framework.Scenes; 32using OpenSim.Region.Framework.Scenes;
32 33
@@ -82,6 +83,34 @@ namespace OpenSim.Region.Framework.Interfaces
82 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus); 83 IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus);
83 84
84 /// <summary> 85 /// <summary>
86 /// Rez multiple attachments from a user's inventory
87 /// </summary>
88 /// <param name="remoteClient"></param>
89 /// <param name="header"></param>
90 /// <param name="objects"></param>
91 void RezMultipleAttachmentsFromInventory(
92 IClientAPI remoteClient,
93 RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
94 RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects);
95
96 /// <summary>
97 /// Detach an object from the avatar.
98 /// </summary>
99 ///
100 /// This method is called in response to a client's detach request, so we only update the information in
101 /// inventory
102 /// <param name="objectLocalID"></param>
103 /// <param name="remoteClient"></param>
104 void DetachObject(uint objectLocalID, IClientAPI remoteClient);
105
106 /// <summary>
107 /// Detach the given item to the ground.
108 /// </summary>
109 /// <param name="itemID"></param>
110 /// <param name="remoteClient"></param>
111 void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient);
112
113 /// <summary>
85 /// Update the user inventory to the attachment of an item 114 /// Update the user inventory to the attachment of an item
86 /// </summary> 115 /// </summary>
87 /// <param name="att"></param> 116 /// <param name="att"></param>
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index f58904f..2b90960 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -74,6 +74,7 @@ namespace OpenSim.Region.Framework.Interfaces
74 void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource); 74 void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource);
75 75
76 ArrayList GetScriptErrors(UUID itemID); 76 ArrayList GetScriptErrors(UUID itemID);
77 void ResumeScripts();
77 78
78 /// <summary> 79 /// <summary>
79 /// Stop all the scripts in this entity. 80 /// Stop all the scripts in this entity.
diff --git a/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs
index 991d60c..89e59d0 100644
--- a/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IRegionArchiverModule.cs
@@ -90,8 +90,12 @@ namespace OpenSim.Region.Framework.Interfaces
90 /// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region 90 /// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region
91 /// settings in the archive will be ignored. 91 /// settings in the archive will be ignored.
92 /// </param> 92 /// </param>
93 /// <param name="skipAssets">
94 /// If true, the archive is loaded without loading any assets contained within it. This is useful if the
95 /// assets are already known to be present in the grid's asset service.
96 /// </param>
93 /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> 97 /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param>
94 void DearchiveRegion(string loadPath, bool merge, Guid requestId); 98 void DearchiveRegion(string loadPath, bool merge, bool skipAssets, Guid requestId);
95 99
96 /// <summary> 100 /// <summary>
97 /// Dearchive a region from a stream. This replaces the existing scene. 101 /// Dearchive a region from a stream. This replaces the existing scene.
@@ -113,7 +117,11 @@ namespace OpenSim.Region.Framework.Interfaces
113 /// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region 117 /// If true, the loaded region merges with the existing one rather than replacing it. Any terrain or region
114 /// settings in the archive will be ignored. 118 /// settings in the archive will be ignored.
115 /// </param> 119 /// </param>
120 /// <param name="skipAssets">
121 /// If true, the archive is loaded without loading any assets contained within it. This is useful if the
122 /// assets are already known to be present in the grid's asset service.
123 /// </param
116 /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param> 124 /// <param name="requestId">If supplied, this request Id is later returned in the saved event</param>
117 void DearchiveRegion(Stream loadStream, bool merge, Guid requestId); 125 void DearchiveRegion(Stream loadStream, bool merge, bool skipAssets, Guid requestId);
118 } 126 }
119} 127}
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index e90b300..fecdd1b 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -41,6 +41,14 @@ namespace OpenSim.Region.Framework.Interfaces
41 bool PostScriptEvent(UUID itemID, string name, Object[] args); 41 bool PostScriptEvent(UUID itemID, string name, Object[] args);
42 bool PostObjectEvent(UUID itemID, string name, Object[] args); 42 bool PostObjectEvent(UUID itemID, string name, Object[] args);
43 43
44 // Suspend ALL scripts in a given scene object. The item ID
45 // is the UUID of a SOG, and the method acts on all contained
46 // scripts. This is different from the suspend/resume that
47 // can be issued by a client.
48 //
49 void SuspendScript(UUID itemID);
50 void ResumeScript(UUID itemID);
51
44 ArrayList GetScriptErrors(UUID itemID); 52 ArrayList GetScriptErrors(UUID itemID);
45 } 53 }
46} 54}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 7c68ef4..15b5230 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -35,7 +35,6 @@ using OpenMetaverse;
35using OpenMetaverse.Packets; 35using OpenMetaverse.Packets;
36using log4net; 36using log4net;
37using OpenSim.Framework; 37using OpenSim.Framework;
38
39using OpenSim.Region.Framework; 38using OpenSim.Region.Framework;
40using OpenSim.Region.Framework.Interfaces; 39using OpenSim.Region.Framework.Interfaces;
41using OpenSim.Region.Framework.Scenes.Serialization; 40using OpenSim.Region.Framework.Scenes.Serialization;
@@ -64,6 +63,7 @@ namespace OpenSim.Region.Framework.Scenes
64 if (group is SceneObjectGroup) 63 if (group is SceneObjectGroup)
65 { 64 {
66 ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0); 65 ((SceneObjectGroup) group).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
66 ((SceneObjectGroup) group).ResumeScripts();
67 } 67 }
68 } 68 }
69 } 69 }
@@ -202,7 +202,9 @@ namespace OpenSim.Region.Framework.Scenes
202 202
203 // Update item with new asset 203 // Update item with new asset
204 item.AssetID = asset.FullID; 204 item.AssetID = asset.FullID;
205 group.UpdateInventoryItem(item); 205 if (group.UpdateInventoryItem(item))
206 remoteClient.SendAgentAlertMessage("Notecard saved", false);
207
206 part.GetProperties(remoteClient); 208 part.GetProperties(remoteClient);
207 209
208 // Trigger rerunning of script (use TriggerRezScript event, see RezScript) 210 // Trigger rerunning of script (use TriggerRezScript event, see RezScript)
@@ -219,6 +221,7 @@ namespace OpenSim.Region.Framework.Scenes
219 { 221 {
220 remoteClient.SendAgentAlertMessage("Script saved", false); 222 remoteClient.SendAgentAlertMessage("Script saved", false);
221 } 223 }
224 part.ParentGroup.ResumeScripts();
222 return errors; 225 return errors;
223 } 226 }
224 227
@@ -472,7 +475,6 @@ namespace OpenSim.Region.Framework.Scenes
472 return null; 475 return null;
473 } 476 }
474 477
475
476 if (recipientParentFolderId == UUID.Zero) 478 if (recipientParentFolderId == UUID.Zero)
477 { 479 {
478 InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId); 480 InventoryFolderBase recipientRootFolder = InventoryService.GetRootFolder(recipientId);
@@ -1226,7 +1228,10 @@ namespace OpenSim.Region.Framework.Scenes
1226 remoteClient, part, transactionID, currentItem); 1228 remoteClient, part, transactionID, currentItem);
1227 } 1229 }
1228 if (part.Inventory.UpdateInventoryItem(itemInfo)) 1230 if (part.Inventory.UpdateInventoryItem(itemInfo))
1231 {
1232 remoteClient.SendAgentAlertMessage("Notecard saved", false);
1229 part.GetProperties(remoteClient); 1233 part.GetProperties(remoteClient);
1234 }
1230 } 1235 }
1231 } 1236 }
1232 else 1237 else
@@ -1278,6 +1283,7 @@ namespace OpenSim.Region.Framework.Scenes
1278 // "Rezzed script {0} into prim local ID {1} for user {2}", 1283 // "Rezzed script {0} into prim local ID {1} for user {2}",
1279 // item.inventoryName, localID, remoteClient.Name); 1284 // item.inventoryName, localID, remoteClient.Name);
1280 part.GetProperties(remoteClient); 1285 part.GetProperties(remoteClient);
1286 part.ParentGroup.ResumeScripts();
1281 } 1287 }
1282 else 1288 else
1283 { 1289 {
@@ -1347,6 +1353,7 @@ namespace OpenSim.Region.Framework.Scenes
1347 part.GetProperties(remoteClient); 1353 part.GetProperties(remoteClient);
1348 1354
1349 part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0); 1355 part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
1356 part.ParentGroup.ResumeScripts();
1350 } 1357 }
1351 } 1358 }
1352 1359
@@ -1450,6 +1457,8 @@ namespace OpenSim.Region.Framework.Scenes
1450 destPart.Inventory.CreateScriptInstance(destTaskItem, start_param, false, DefaultScriptEngine, 0); 1457 destPart.Inventory.CreateScriptInstance(destTaskItem, start_param, false, DefaultScriptEngine, 0);
1451 } 1458 }
1452 1459
1460 destPart.ParentGroup.ResumeScripts();
1461
1453 ScenePresence avatar; 1462 ScenePresence avatar;
1454 1463
1455 if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar)) 1464 if (TryGetScenePresence(srcTaskItem.OwnerID, out avatar))
@@ -1870,50 +1879,6 @@ namespace OpenSim.Region.Framework.Scenes
1870 EventManager.TriggerStopScript(part.LocalId, itemID); 1879 EventManager.TriggerStopScript(part.LocalId, itemID);
1871 } 1880 }
1872 1881
1873 internal void SendAttachEvent(uint localID, UUID itemID, UUID avatarID)
1874 {
1875 EventManager.TriggerOnAttach(localID, itemID, avatarID);
1876 }
1877
1878 public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header,
1879 RezMultipleAttachmentsFromInvPacket.ObjectDataBlock[] objects)
1880 {
1881 foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in objects)
1882 {
1883 AttachmentsModule.RezSingleAttachmentFromInventory(remoteClient, obj.ItemID, obj.AttachmentPt);
1884 }
1885 }
1886
1887 public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient)
1888 {
1889 SceneObjectPart part = GetSceneObjectPart(itemID);
1890 if (part == null || part.ParentGroup == null)
1891 return;
1892
1893 UUID inventoryID = part.ParentGroup.GetFromItemID();
1894
1895 ScenePresence presence;
1896 if (TryGetScenePresence(remoteClient.AgentId, out presence))
1897 {
1898 if (!Permissions.CanRezObject(part.ParentGroup.Children.Count, remoteClient.AgentId, presence.AbsolutePosition))
1899 return;
1900
1901 presence.Appearance.DetachAttachment(itemID);
1902 IAvatarFactory ava = RequestModuleInterface<IAvatarFactory>();
1903 if (ava != null)
1904 {
1905 ava.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
1906 }
1907 part.ParentGroup.DetachToGround();
1908
1909 List<UUID> uuids = new List<UUID>();
1910 uuids.Add(inventoryID);
1911 InventoryService.DeleteItems(remoteClient.AgentId, uuids);
1912 remoteClient.SendRemoveInventoryItem(inventoryID);
1913 }
1914 SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero);
1915 }
1916
1917 public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) 1882 public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
1918 { 1883 {
1919 EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID); 1884 EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 685a678..57587be 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1131,7 +1131,6 @@ namespace OpenSim.Region.Framework.Scenes
1131 { 1131 {
1132 if (m_scripts_enabled != !ScriptEngine) 1132 if (m_scripts_enabled != !ScriptEngine)
1133 { 1133 {
1134 // Tedd! Here's the method to disable the scripting engine!
1135 if (ScriptEngine) 1134 if (ScriptEngine)
1136 { 1135 {
1137 m_log.Info("Stopping all Scripts in Scene"); 1136 m_log.Info("Stopping all Scripts in Scene");
@@ -1153,6 +1152,7 @@ namespace OpenSim.Region.Framework.Scenes
1153 if (ent is SceneObjectGroup) 1152 if (ent is SceneObjectGroup)
1154 { 1153 {
1155 ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0); 1154 ((SceneObjectGroup)ent).CreateScriptInstances(0, false, DefaultScriptEngine, 0);
1155 ((SceneObjectGroup)ent).ResumeScripts();
1156 } 1156 }
1157 } 1157 }
1158 } 1158 }
@@ -2769,14 +2769,13 @@ namespace OpenSim.Region.Framework.Scenes
2769 } 2769 }
2770 2770
2771 public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) 2771 public virtual void SubscribeToClientAttachmentEvents(IClientAPI client)
2772 { 2772 {
2773 client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments;
2774 client.OnObjectDetach += m_sceneGraph.DetachObject;
2775
2776 if (AttachmentsModule != null) 2773 if (AttachmentsModule != null)
2777 { 2774 {
2778 client.OnRezSingleAttachmentFromInv += AttachmentsModule.RezSingleAttachmentFromInventory; 2775 client.OnRezSingleAttachmentFromInv += AttachmentsModule.RezSingleAttachmentFromInventory;
2776 client.OnRezMultipleAttachmentsFromInv += AttachmentsModule.RezMultipleAttachmentsFromInventory;
2779 client.OnObjectAttach += AttachmentsModule.AttachObject; 2777 client.OnObjectAttach += AttachmentsModule.AttachObject;
2778 client.OnObjectDetach += AttachmentsModule.DetachObject;
2780 client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory; 2779 client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory;
2781 } 2780 }
2782 } 2781 }
@@ -2925,14 +2924,13 @@ namespace OpenSim.Region.Framework.Scenes
2925 } 2924 }
2926 2925
2927 public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) 2926 public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client)
2928 { 2927 {
2929 client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments;
2930 client.OnObjectDetach -= m_sceneGraph.DetachObject;
2931
2932 if (AttachmentsModule != null) 2928 if (AttachmentsModule != null)
2933 { 2929 {
2934 client.OnRezSingleAttachmentFromInv -= AttachmentsModule.RezSingleAttachmentFromInventory; 2930 client.OnRezSingleAttachmentFromInv -= AttachmentsModule.RezSingleAttachmentFromInventory;
2931 client.OnRezMultipleAttachmentsFromInv -= AttachmentsModule.RezMultipleAttachmentsFromInventory;
2935 client.OnObjectAttach -= AttachmentsModule.AttachObject; 2932 client.OnObjectAttach -= AttachmentsModule.AttachObject;
2933 client.OnObjectDetach -= AttachmentsModule.DetachObject;
2936 client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory; 2934 client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory;
2937 } 2935 }
2938 } 2936 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 23a4ee9..1421d0e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -443,9 +443,7 @@ namespace OpenSim.Region.Framework.Scenes
443 { 443 {
444 SceneObjectGroup group = GetGroupByPrim(objectLocalID); 444 SceneObjectGroup group = GetGroupByPrim(objectLocalID);
445 if (group != null) 445 if (group != null)
446 { 446 m_parentScene.AttachmentsModule.DetachSingleAttachmentToGround(group.UUID, remoteClient);
447 m_parentScene.DetachSingleAttachmentToGround(group.UUID, remoteClient);
448 }
449 } 447 }
450 448
451 protected internal void DetachObject(uint objectLocalID, IClientAPI remoteClient) 449 protected internal void DetachObject(uint objectLocalID, IClientAPI remoteClient)
@@ -1757,6 +1755,7 @@ namespace OpenSim.Region.Framework.Scenes
1757 copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0); 1755 copy.CreateScriptInstances(0, false, m_parentScene.DefaultScriptEngine, 0);
1758 copy.HasGroupChanged = true; 1756 copy.HasGroupChanged = true;
1759 copy.ScheduleGroupForFullUpdate(); 1757 copy.ScheduleGroupForFullUpdate();
1758 copy.ResumeScripts();
1760 1759
1761 // required for physics to update it's position 1760 // required for physics to update it's position
1762 copy.AbsolutePosition = copy.AbsolutePosition; 1761 copy.AbsolutePosition = copy.AbsolutePosition;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index 4034744..f7e46af 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -416,5 +416,13 @@ namespace OpenSim.Region.Framework.Scenes
416 scriptModule.SetXMLState(itemID, n.OuterXml); 416 scriptModule.SetXMLState(itemID, n.OuterXml);
417 } 417 }
418 } 418 }
419
420 public void ResumeScripts()
421 {
422 foreach (SceneObjectPart part in m_parts.Values)
423 {
424 part.Inventory.ResumeScripts();
425 }
426 }
419 } 427 }
420} 428}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 2e13f90..3b1b567 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -282,36 +282,32 @@ namespace OpenSim.Region.Framework.Scenes
282 return; 282 return;
283 } 283 }
284 284
285 m_part.ParentGroup.Scene.AssetService.Get( 285 AssetBase asset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString());
286 item.AssetID.ToString(), this, delegate(string id, object sender, AssetBase asset) 286 if (null == asset)
287 { 287 {
288 if (null == asset) 288 m_log.ErrorFormat(
289 { 289 "[PRIM INVENTORY]: " +
290 m_log.ErrorFormat( 290 "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
291 "[PRIM INVENTORY]: " + 291 item.Name, item.ItemID, m_part.AbsolutePosition,
292 "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found", 292 m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
293 item.Name, item.ItemID, m_part.AbsolutePosition, 293 }
294 m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID); 294 else
295 } 295 {
296 else 296 if (m_part.ParentGroup.m_savedScriptState != null)
297 { 297 RestoreSavedScriptState(item.OldItemID, item.ItemID);
298 if (m_part.ParentGroup.m_savedScriptState != null)
299 RestoreSavedScriptState(item.OldItemID, item.ItemID);
300 298
301 lock (m_items) 299 lock (m_items)
302 { 300 {
303 m_items[item.ItemID].PermsMask = 0; 301 m_items[item.ItemID].PermsMask = 0;
304 m_items[item.ItemID].PermsGranter = UUID.Zero; 302 m_items[item.ItemID].PermsGranter = UUID.Zero;
305 }
306
307 string script = Utils.BytesToString(asset.Data);
308 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
309 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
310 m_part.ParentGroup.AddActiveScriptCount(1);
311 m_part.ScheduleFullUpdate();
312 }
313 } 303 }
314 ); 304
305 string script = Utils.BytesToString(asset.Data);
306 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
307 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
308 m_part.ParentGroup.AddActiveScriptCount(1);
309 m_part.ScheduleFullUpdate();
310 }
315 } 311 }
316 } 312 }
317 313
@@ -630,16 +626,6 @@ namespace OpenSim.Region.Framework.Scenes
630 { 626 {
631 item.AssetID = m_items[item.ItemID].AssetID; 627 item.AssetID = m_items[item.ItemID].AssetID;
632 } 628 }
633 else if ((InventoryType)item.Type == InventoryType.Notecard)
634 {
635 ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID);
636
637 if (presence != null)
638 {
639 presence.ControllingClient.SendAgentAlertMessage(
640 "Notecard saved", false);
641 }
642 }
643 629
644 m_items[item.ItemID] = item; 630 m_items[item.ItemID] = item;
645 m_inventorySerial++; 631 m_inventorySerial++;
@@ -1042,5 +1028,28 @@ namespace OpenSim.Region.Framework.Scenes
1042 1028
1043 return ret; 1029 return ret;
1044 } 1030 }
1031
1032 public void ResumeScripts()
1033 {
1034 IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces<IScriptModule>();
1035 if (engines == null)
1036 return;
1037
1038
1039 lock (m_items)
1040 {
1041 foreach (TaskInventoryItem item in m_items.Values)
1042 {
1043 if (item.InvType == (int)InventoryType.LSL)
1044 {
1045 foreach (IScriptModule engine in engines)
1046 {
1047 if (engine != null)
1048 engine.ResumeScript(item.ItemID);
1049 }
1050 }
1051 }
1052 }
1053 }
1045 } 1054 }
1046} \ No newline at end of file 1055}
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs
index cf0f345..b6677f0 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneXmlLoader.cs
@@ -182,6 +182,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
182 foreach (SceneObjectGroup sceneObject in sceneObjects) 182 foreach (SceneObjectGroup sceneObject in sceneObjects)
183 { 183 {
184 sceneObject.CreateScriptInstances(0, true, scene.DefaultScriptEngine, 0); 184 sceneObject.CreateScriptInstances(0, true, scene.DefaultScriptEngine, 0);
185 sceneObject.ResumeScripts();
185 } 186 }
186 } 187 }
187 188
diff --git a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs
index e664b44..d49a489 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCBridgeModule.cs
@@ -109,7 +109,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat
109 } 109 }
110 else 110 else
111 { 111 {
112 m_log.WarnFormat("[IRC-Bridge] Not enabled. Connect for region {0} ignored", scene.RegionInfo.RegionName); 112 //m_log.DebugFormat("[IRC-Bridge] Not enabled. Connect for region {0} ignored", scene.RegionInfo.RegionName);
113 } 113 }
114 } 114 }
115 115
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
index e7967d1..79b9a16 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
@@ -142,8 +142,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
142 m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Groups Cache Timeout set to {0}.", m_cacheTimeout); 142 m_log.InfoFormat("[XMLRPC-GROUPS-CONNECTOR]: Groups Cache Timeout set to {0}.", m_cacheTimeout);
143 } 143 }
144 144
145
146 // If we got all the config options we need, lets start'er'up 145 // If we got all the config options we need, lets start'er'up
146 m_memoryCache = new ExpiringCache<string, XmlRpcResponse>();
147 m_connectorEnabled = true; 147 m_connectorEnabled = true;
148 } 148 }
149 } 149 }
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index ae148a9..9f6ea35 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -81,6 +81,9 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
81 81
82 void PostEvent(EventParams data); 82 void PostEvent(EventParams data);
83 83
84 void Suspend();
85 void Resume();
86
84 /// <summary> 87 /// <summary>
85 /// Process the next event queued for this script 88 /// Process the next event queued for this script
86 /// </summary> 89 /// </summary>
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index 2296379..4d7ead6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -302,6 +302,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
302 float dz; 302 float dz;
303 303
304 Quaternion q = SensePoint.RotationOffset; 304 Quaternion q = SensePoint.RotationOffset;
305 if (SensePoint.ParentGroup.RootPart.IsAttachment)
306 {
307 // In attachments, the sensor cone always orients with the
308 // avatar rotation. This may include a nonzero elevation if
309 // in mouselook.
310
311 ScenePresence avatar = m_CmdManager.m_ScriptEngine.World.GetScenePresence(SensePoint.ParentGroup.RootPart.AttachedAvatar);
312 q = avatar.Rotation;
313 }
305 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); 314 LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W);
306 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); 315 LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r);
307 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); 316 double mag_fwd = LSL_Types.Vector3.Mag(forward_dir);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index d30d2dc..3dd381d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -95,6 +95,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
95 private bool m_startedFromSavedState; 95 private bool m_startedFromSavedState;
96 private UUID m_CurrentStateHash; 96 private UUID m_CurrentStateHash;
97 private UUID m_RegionID; 97 private UUID m_RegionID;
98 private bool m_Suspended = false;
98 99
99 private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> 100 private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>
100 m_LineMap; 101 m_LineMap;
@@ -638,6 +639,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
638 /// <returns></returns> 639 /// <returns></returns>
639 public object EventProcessor() 640 public object EventProcessor()
640 { 641 {
642 if (m_Suspended)
643 return 0;
644
641 lock (m_Script) 645 lock (m_Script)
642 { 646 {
643 EventParams data = null; 647 EventParams data = null;
@@ -1011,5 +1015,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1011 { 1015 {
1012 get { return m_RegionID; } 1016 get { return m_RegionID; }
1013 } 1017 }
1018
1019 public void Suspend()
1020 {
1021 m_Suspended = true;
1022 }
1023
1024 public void Resume()
1025 {
1026 m_Suspended = false;
1027 }
1014 } 1028 }
1015} 1029}
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 98e77c0..54074ed 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1488,5 +1488,23 @@ namespace OpenSim.Region.ScriptEngine.XEngine
1488 return new ArrayList(); 1488 return new ArrayList();
1489 } 1489 }
1490 } 1490 }
1491
1492 public void SuspendScript(UUID itemID)
1493 {
1494 IScriptInstance instance = GetInstance(itemID);
1495 if (instance == null)
1496 return;
1497
1498 instance.Suspend();
1499 }
1500
1501 public void ResumeScript(UUID itemID)
1502 {
1503 IScriptInstance instance = GetInstance(itemID);
1504 if (instance == null)
1505 return;
1506
1507 instance.Resume();
1508 }
1491 } 1509 }
1492} 1510}