aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs428
1 files changed, 198 insertions, 230 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 3a8f168..20d5486 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -118,20 +118,20 @@ namespace OpenSim.Region.Framework.Scenes
118 /// <param name="linkNum">Link number for the part</param> 118 /// <param name="linkNum">Link number for the part</param>
119 public void ResetInventoryIDs() 119 public void ResetInventoryIDs()
120 { 120 {
121 lock (Items) 121 lock (m_items)
122 { 122 {
123 if (0 == Items.Count) 123 if (0 == m_items.Count)
124 return; 124 return;
125 125
126 HasInventoryChanged = true; 126 HasInventoryChanged = true;
127 m_part.ParentGroup.HasGroupChanged = true; 127 m_part.ParentGroup.HasGroupChanged = true;
128 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 128 IList<TaskInventoryItem> items = GetInventoryItems();
129 Items.Clear(); 129 m_items.Clear();
130 130
131 foreach (TaskInventoryItem item in items) 131 foreach (TaskInventoryItem item in items)
132 { 132 {
133 item.ResetIDs(m_part.UUID); 133 item.ResetIDs(m_part.UUID);
134 Items.Add(item.ItemID, item); 134 m_items.Add(item.ItemID, item);
135 } 135 }
136 } 136 }
137 } 137 }
@@ -148,17 +148,17 @@ namespace OpenSim.Region.Framework.Scenes
148 { 148 {
149 return; 149 return;
150 } 150 }
151 }
151 152
152 HasInventoryChanged = true; 153 HasInventoryChanged = true;
153 m_part.ParentGroup.HasGroupChanged = true; 154 m_part.ParentGroup.HasGroupChanged = true;
154 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 155 List<TaskInventoryItem> items = GetInventoryItems();
155 foreach (TaskInventoryItem item in items) 156 foreach (TaskInventoryItem item in items)
157 {
158 if (ownerId != item.OwnerID)
156 { 159 {
157 if (ownerId != item.OwnerID) 160 item.LastOwnerID = item.OwnerID;
158 { 161 item.OwnerID = ownerId;
159 item.LastOwnerID = item.OwnerID;
160 item.OwnerID = ownerId;
161 }
162 } 162 }
163 } 163 }
164 } 164 }
@@ -175,17 +175,15 @@ namespace OpenSim.Region.Framework.Scenes
175 { 175 {
176 return; 176 return;
177 } 177 }
178 }
178 179
179 HasInventoryChanged = true; 180 HasInventoryChanged = true;
180 m_part.ParentGroup.HasGroupChanged = true; 181 m_part.ParentGroup.HasGroupChanged = true;
181 IList<TaskInventoryItem> items = new List<TaskInventoryItem>(Items.Values); 182 List<TaskInventoryItem> items = GetInventoryItems();
182 foreach (TaskInventoryItem item in items) 183 foreach (TaskInventoryItem item in items)
183 { 184 {
184 if (groupID != item.GroupID) 185 if (groupID != item.GroupID)
185 { 186 item.GroupID = groupID;
186 item.GroupID = groupID;
187 }
188 }
189 } 187 }
190 } 188 }
191 189
@@ -194,17 +192,9 @@ namespace OpenSim.Region.Framework.Scenes
194 /// </summary> 192 /// </summary>
195 public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource) 193 public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
196 { 194 {
197 lock (m_items) 195 List<TaskInventoryItem> scripts = GetInventoryScripts();
198 { 196 foreach (TaskInventoryItem item in scripts)
199 foreach (TaskInventoryItem item in Items.Values) 197 CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
200 {
201 if ((int)InventoryType.LSL == item.InvType)
202 {
203 CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
204 Thread.Sleep(10); // workaround for Mono cpu utilization > 100% bug
205 }
206 }
207 }
208 } 198 }
209 199
210 public ArrayList GetScriptErrors(UUID itemID) 200 public ArrayList GetScriptErrors(UUID itemID)
@@ -237,16 +227,9 @@ namespace OpenSim.Region.Framework.Scenes
237 /// </param> 227 /// </param>
238 public void RemoveScriptInstances(bool sceneObjectBeingDeleted) 228 public void RemoveScriptInstances(bool sceneObjectBeingDeleted)
239 { 229 {
240 lock (Items) 230 List<TaskInventoryItem> scripts = GetInventoryScripts();
241 { 231 foreach (TaskInventoryItem item in scripts)
242 foreach (TaskInventoryItem item in Items.Values) 232 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
243 {
244 if ((int)InventoryType.LSL == item.InvType)
245 {
246 RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
247 }
248 }
249 }
250 } 233 }
251 234
252 /// <summary> 235 /// <summary>
@@ -259,7 +242,7 @@ namespace OpenSim.Region.Framework.Scenes
259 // m_log.InfoFormat( 242 // m_log.InfoFormat(
260 // "[PRIM INVENTORY]: " + 243 // "[PRIM INVENTORY]: " +
261 // "Starting script {0}, {1} in prim {2}, {3}", 244 // "Starting script {0}, {1} in prim {2}, {3}",
262 // item.Name, item.ItemID, m_part.Name, m_part.UUID); 245 // item.Name, item.ItemID, Name, UUID);
263 246
264 if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID)) 247 if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
265 return; 248 return;
@@ -295,20 +278,20 @@ namespace OpenSim.Region.Framework.Scenes
295 } 278 }
296 else 279 else
297 { 280 {
281 if (m_part.ParentGroup.m_savedScriptState != null)
282 RestoreSavedScriptState(item.OldItemID, item.ItemID);
283
298 lock (m_items) 284 lock (m_items)
299 { 285 {
300 if (m_part.ParentGroup.m_savedScriptState != null)
301 RestoreSavedScriptState(item.OldItemID, item.ItemID);
302
303 m_items[item.ItemID].PermsMask = 0; 286 m_items[item.ItemID].PermsMask = 0;
304 m_items[item.ItemID].PermsGranter = UUID.Zero; 287 m_items[item.ItemID].PermsGranter = UUID.Zero;
305
306 string script = Utils.BytesToString(asset.Data);
307 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
308 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
309 m_part.ParentGroup.AddActiveScriptCount(1);
310 m_part.ScheduleFullUpdate();
311 } 288 }
289
290 string script = Utils.BytesToString(asset.Data);
291 m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
292 m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
293 m_part.ParentGroup.AddActiveScriptCount(1);
294 m_part.ScheduleFullUpdate();
312 } 295 }
313 } 296 }
314 } 297 }
@@ -376,21 +359,15 @@ namespace OpenSim.Region.Framework.Scenes
376 /// </param> 359 /// </param>
377 public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource) 360 public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
378 { 361 {
379 lock (m_items) 362 TaskInventoryItem item = GetInventoryItem(itemId);
380 { 363 if (item != null)
381 if (m_items.ContainsKey(itemId)) 364 CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
382 { 365 else
383 CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource); 366 m_log.ErrorFormat(
384 } 367 "[PRIM INVENTORY]: " +
385 else 368 "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}",
386 { 369 itemId, m_part.Name, m_part.UUID,
387 m_log.ErrorFormat( 370 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
388 "[PRIM INVENTORY]: " +
389 "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}",
390 itemId, m_part.Name, m_part.UUID,
391 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
392 }
393 }
394 } 371 }
395 372
396 /// <summary> 373 /// <summary>
@@ -431,16 +408,18 @@ namespace OpenSim.Region.Framework.Scenes
431 408
432 /// <summary> 409 /// <summary>
433 /// Check if the inventory holds an item with a given name. 410 /// Check if the inventory holds an item with a given name.
434 /// This method assumes that the task inventory is already locked.
435 /// </summary> 411 /// </summary>
436 /// <param name="name"></param> 412 /// <param name="name"></param>
437 /// <returns></returns> 413 /// <returns></returns>
438 private bool InventoryContainsName(string name) 414 private bool InventoryContainsName(string name)
439 { 415 {
440 foreach (TaskInventoryItem item in Items.Values) 416 lock (m_items)
441 { 417 {
442 if (item.Name == name) 418 foreach (TaskInventoryItem item in m_items.Values)
443 return true; 419 {
420 if (item.Name == name)
421 return true;
422 }
444 } 423 }
445 return false; 424 return false;
446 } 425 }
@@ -483,12 +462,7 @@ namespace OpenSim.Region.Framework.Scenes
483 /// <param name="item"></param> 462 /// <param name="item"></param>
484 public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop) 463 public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop)
485 { 464 {
486 List<TaskInventoryItem> il; 465 List<TaskInventoryItem> il = GetInventoryItems();
487
488 lock (m_items)
489 {
490 il = new List<TaskInventoryItem>(m_items.Values);
491 }
492 466
493 foreach (TaskInventoryItem i in il) 467 foreach (TaskInventoryItem i in il)
494 { 468 {
@@ -528,14 +502,12 @@ namespace OpenSim.Region.Framework.Scenes
528 item.GroupID = m_part.GroupID; 502 item.GroupID = m_part.GroupID;
529 503
530 lock (m_items) 504 lock (m_items)
531 {
532 m_items.Add(item.ItemID, item); 505 m_items.Add(item.ItemID, item);
533 506
534 if (allowedDrop) 507 if (allowedDrop)
535 m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP); 508 m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP);
536 else 509 else
537 m_part.TriggerScriptChangedEvent(Changed.INVENTORY); 510 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
538 }
539 511
540 m_inventorySerial++; 512 m_inventorySerial++;
541 //m_inventorySerial += 2; 513 //m_inventorySerial += 2;
@@ -559,9 +531,8 @@ namespace OpenSim.Region.Framework.Scenes
559 m_items.Add(item.ItemID, item); 531 m_items.Add(item.ItemID, item);
560// m_part.TriggerScriptChangedEvent(Changed.INVENTORY); 532// m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
561 } 533 }
534 m_inventorySerial++;
562 } 535 }
563
564 m_inventorySerial++;
565 } 536 }
566 537
567 /// <summary> 538 /// <summary>
@@ -616,45 +587,44 @@ namespace OpenSim.Region.Framework.Scenes
616 587
617 public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents) 588 public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents)
618 { 589 {
619 lock(m_items) 590 TaskInventoryItem it = GetInventoryItem(item.ItemID);
591 if (it != null)
620 { 592 {
621 if (m_items.ContainsKey(item.ItemID)) 593 item.ParentID = m_part.UUID;
622 { 594 item.ParentPartID = m_part.UUID;
623 if (m_items.ContainsKey(item.ItemID)) 595 item.Flags = m_items[item.ItemID].Flags;
624 { 596
625 item.ParentID = m_part.UUID; 597 // If group permissions have been set on, check that the groupID is up to date in case it has
626 item.ParentPartID = m_part.UUID; 598 // changed since permissions were last set.
627 item.Flags = m_items[item.ItemID].Flags; 599 if (item.GroupPermissions != (uint)PermissionMask.None)
628 600 item.GroupID = m_part.GroupID;
629 // If group permissions have been set on, check that the groupID is up to date in case it has
630 // changed since permissions were last set.
631 if (item.GroupPermissions != (uint)PermissionMask.None)
632 item.GroupID = m_part.GroupID;
633 601
634 if (item.AssetID == UUID.Zero) 602 if (item.AssetID == UUID.Zero)
635 { 603 item.AssetID = it.AssetID;
636 item.AssetID = m_items[item.ItemID].AssetID;
637 }
638 m_items[item.ItemID] = item;
639 m_inventorySerial++;
640 if (fireScriptEvents)
641 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
642 HasInventoryChanged = true;
643 m_part.ParentGroup.HasGroupChanged = true;
644 return true;
645 }
646 else
647 {
648 m_log.ErrorFormat(
649 "[PRIM INVENTORY]: " +
650 "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory",
651 item.ItemID, m_part.Name, m_part.UUID,
652 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
653 }
654 604
605 lock (m_items)
606 {
607 m_items[item.ItemID] = item;
608 m_inventorySerial++;
655 } 609 }
656 return false; 610
611 if (fireScriptEvents)
612 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
613
614 HasInventoryChanged = true;
615 m_part.ParentGroup.HasGroupChanged = true;
616 return true;
617 }
618 else
619 {
620 m_log.ErrorFormat(
621 "[PRIM INVENTORY]: " +
622 "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory",
623 item.ItemID, m_part.Name, m_part.UUID,
624 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
657 } 625 }
626 return false;
627
658 } 628 }
659 629
660 /// <summary> 630 /// <summary>
@@ -665,52 +635,37 @@ namespace OpenSim.Region.Framework.Scenes
665 /// in this prim's inventory.</returns> 635 /// in this prim's inventory.</returns>
666 public int RemoveInventoryItem(UUID itemID) 636 public int RemoveInventoryItem(UUID itemID)
667 { 637 {
668 lock (m_items) 638 TaskInventoryItem item = GetInventoryItem(itemID);
639 if (item != null)
669 { 640 {
670 if (m_items.ContainsKey(itemID)) 641 int type = m_items[itemID].InvType;
642 if (type == 10) // Script
671 { 643 {
672 int type = m_items[itemID].InvType; 644 m_part.RemoveScriptEvents(itemID);
673 if (type == 10) // Script 645 m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
674 { 646 }
675 m_part.RemoveScriptEvents(itemID); 647 m_items.Remove(itemID);
676 m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID); 648 m_inventorySerial++;
677 } 649 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
678 m_items.Remove(itemID);
679 m_inventorySerial++;
680 m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
681
682 HasInventoryChanged = true;
683 m_part.ParentGroup.HasGroupChanged = true;
684 650
685 int scriptcount = 0; 651 HasInventoryChanged = true;
686 lock (m_items) 652 m_part.ParentGroup.HasGroupChanged = true;
687 {
688 foreach (TaskInventoryItem item in m_items.Values)
689 {
690 if (item.Type == 10)
691 {
692 scriptcount++;
693 }
694 }
695 }
696 653
697 if (scriptcount <= 0) 654 if (!ContainsScripts())
698 { 655 m_part.RemFlag(PrimFlags.Scripted);
699 m_part.RemFlag(PrimFlags.Scripted);
700 }
701 656
702 m_part.ScheduleFullUpdate(); 657 m_part.ScheduleFullUpdate();
703 658
704 return type; 659 return type;
705 } 660
706 else 661 }
707 { 662 else
708 m_log.ErrorFormat( 663 {
709 "[PRIM INVENTORY]: " + 664 m_log.ErrorFormat(
710 "Tried to remove item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", 665 "[PRIM INVENTORY]: " +
711 itemID, m_part.Name, m_part.UUID, 666 "Tried to remove item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory",
712 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); 667 itemID, m_part.Name, m_part.UUID,
713 } 668 m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
714 } 669 }
715 670
716 return -1; 671 return -1;
@@ -764,52 +719,50 @@ namespace OpenSim.Region.Framework.Scenes
764 // isn't available (such as drag from prim inventory to agent inventory) 719 // isn't available (such as drag from prim inventory to agent inventory)
765 InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero); 720 InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero);
766 721
767 lock (m_items) 722 List<TaskInventoryItem> items = GetInventoryItems();
723 foreach (TaskInventoryItem item in items)
768 { 724 {
769 foreach (TaskInventoryItem item in m_items.Values) 725 UUID ownerID = item.OwnerID;
770 { 726 uint everyoneMask = 0;
771 UUID ownerID = item.OwnerID; 727 uint baseMask = item.BasePermissions;
772 uint everyoneMask = 0; 728 uint ownerMask = item.CurrentPermissions;
773 uint baseMask = item.BasePermissions; 729 uint groupMask = item.GroupPermissions;
774 uint ownerMask = item.CurrentPermissions;
775 uint groupMask = item.GroupPermissions;
776 730
777 invString.AddItemStart(); 731 invString.AddItemStart();
778 invString.AddNameValueLine("item_id", item.ItemID.ToString()); 732 invString.AddNameValueLine("item_id", item.ItemID.ToString());
779 invString.AddNameValueLine("parent_id", m_part.UUID.ToString()); 733 invString.AddNameValueLine("parent_id", m_part.UUID.ToString());
780 734
781 invString.AddPermissionsStart(); 735 invString.AddPermissionsStart();
782 736
783 invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask)); 737 invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
784 invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask)); 738 invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
785 invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask)); 739 invString.AddNameValueLine("group_mask", Utils.UIntToHexString(groupMask));
786 invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask)); 740 invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
787 invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions)); 741 invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
788 742
789 invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); 743 invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
790 invString.AddNameValueLine("owner_id", ownerID.ToString()); 744 invString.AddNameValueLine("owner_id", ownerID.ToString());
791 745
792 invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); 746 invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
793 747
794 invString.AddNameValueLine("group_id", item.GroupID.ToString()); 748 invString.AddNameValueLine("group_id", item.GroupID.ToString());
795 invString.AddSectionEnd(); 749 invString.AddSectionEnd();
796 750
797 invString.AddNameValueLine("asset_id", item.AssetID.ToString()); 751 invString.AddNameValueLine("asset_id", item.AssetID.ToString());
798 invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); 752 invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
799 invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); 753 invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
800 invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags)); 754 invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags));
801 755
802 invString.AddSaleStart(); 756 invString.AddSaleStart();
803 invString.AddNameValueLine("sale_type", "not"); 757 invString.AddNameValueLine("sale_type", "not");
804 invString.AddNameValueLine("sale_price", "0"); 758 invString.AddNameValueLine("sale_price", "0");
805 invString.AddSectionEnd(); 759 invString.AddSectionEnd();
806 760
807 invString.AddNameValueLine("name", item.Name + "|"); 761 invString.AddNameValueLine("name", item.Name + "|");
808 invString.AddNameValueLine("desc", item.Description + "|"); 762 invString.AddNameValueLine("desc", item.Description + "|");
809 763
810 invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); 764 invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
811 invString.AddSectionEnd(); 765 invString.AddSectionEnd();
812 }
813 } 766 }
814 767
815 fileData = Utils.StringToBytes(invString.BuildString); 768 fileData = Utils.StringToBytes(invString.BuildString);
@@ -831,12 +784,10 @@ namespace OpenSim.Region.Framework.Scenes
831 { 784 {
832 if (HasInventoryChanged) 785 if (HasInventoryChanged)
833 { 786 {
834 lock (Items)
835 {
836 datastore.StorePrimInventory(m_part.UUID, Items.Values);
837 }
838
839 HasInventoryChanged = false; 787 HasInventoryChanged = false;
788 List<TaskInventoryItem> items = GetInventoryItems();
789 datastore.StorePrimInventory(m_part.UUID, items);
790
840 } 791 }
841 } 792 }
842 793
@@ -1002,6 +953,30 @@ namespace OpenSim.Region.Framework.Scenes
1002 953
1003 return ret; 954 return ret;
1004 } 955 }
956
957 public List<TaskInventoryItem> GetInventoryItems()
958 {
959 List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
960
961 lock (m_items)
962 ret = new List<TaskInventoryItem>(m_items.Values);
963
964 return ret;
965 }
966
967 public List<TaskInventoryItem> GetInventoryScripts()
968 {
969 List<TaskInventoryItem> ret = new List<TaskInventoryItem>();
970
971 lock (m_items)
972 {
973 foreach (TaskInventoryItem item in m_items.Values)
974 if (item.InvType == (int)InventoryType.LSL)
975 ret.Add(item);
976 }
977
978 return ret;
979 }
1005 980
1006 public Dictionary<UUID, string> GetScriptStates() 981 public Dictionary<UUID, string> GetScriptStates()
1007 { 982 {
@@ -1011,24 +986,20 @@ namespace OpenSim.Region.Framework.Scenes
1011 if (engines == null) // No engine at all 986 if (engines == null) // No engine at all
1012 return ret; 987 return ret;
1013 988
1014 lock (m_items) 989 List<TaskInventoryItem> scripts = GetInventoryScripts();
990
991 foreach (TaskInventoryItem item in scripts)
1015 { 992 {
1016 foreach (TaskInventoryItem item in m_items.Values) 993 foreach (IScriptModule e in engines)
1017 { 994 {
1018 if (item.InvType == (int)InventoryType.LSL) 995 if (e != null)
1019 { 996 {
1020 foreach (IScriptModule e in engines) 997 string n = e.GetXMLState(item.ItemID);
998 if (n != String.Empty)
1021 { 999 {
1022 if (e != null) 1000 if (!ret.ContainsKey(item.ItemID))
1023 { 1001 ret[item.ItemID] = n;
1024 string n = e.GetXMLState(item.ItemID); 1002 break;
1025 if (n != String.Empty)
1026 {
1027 if (!ret.ContainsKey(item.ItemID))
1028 ret[item.ItemID] = n;
1029 break;
1030 }
1031 }
1032 } 1003 }
1033 } 1004 }
1034 } 1005 }
@@ -1043,25 +1014,22 @@ namespace OpenSim.Region.Framework.Scenes
1043 if (engines == null) 1014 if (engines == null)
1044 return; 1015 return;
1045 1016
1046 lock (m_items) 1017 List<TaskInventoryItem> scripts = GetInventoryScripts();
1018
1019 foreach (TaskInventoryItem item in scripts)
1047 { 1020 {
1048 foreach (TaskInventoryItem item in m_items.Values) 1021 foreach (IScriptModule engine in engines)
1049 { 1022 {
1050 if (item.InvType == (int)InventoryType.LSL) 1023 if (engine != null)
1051 { 1024 {
1052 foreach (IScriptModule engine in engines) 1025 if (item.OwnerChanged)
1053 { 1026 engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER });
1054 if (engine != null) 1027 item.OwnerChanged = false;
1055 { 1028 engine.ResumeScript(item.ItemID);
1056 if (item.OwnerChanged)
1057 engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER });
1058 item.OwnerChanged = false;
1059 engine.ResumeScript(item.ItemID);
1060 }
1061 }
1062 } 1029 }
1063 } 1030 }
1064 } 1031 }
1065 } 1032 }
1033
1066 } 1034 }
1067} 1035}