aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs148
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs13
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs13
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs822
-rw-r--r--OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs55
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs5
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs78
-rw-r--r--OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs224
-rw-r--r--OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs4
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs3
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs2
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs211
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs7
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs6
-rw-r--r--OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs155
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs2
-rw-r--r--OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs28
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEntityInventory.cs13
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs7
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs36
-rw-r--r--OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs10
-rw-r--r--OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs21
-rw-r--r--OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs20
-rw-r--r--OpenSim/Region/Framework/Interfaces/IUrlModule.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs81
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs28
-rw-r--r--OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs20
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs42
-rw-r--r--OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs14
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs139
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs22
33 files changed, 1491 insertions, 751 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 2bfe190..7a91481 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -50,7 +50,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51 51
52 private Scene m_scene; 52 private Scene m_scene;
53 private IDialogModule m_dialogModule; 53 private IInventoryAccessModule m_invAccessModule;
54 54
55 /// <summary> 55 /// <summary>
56 /// Are attachments enabled? 56 /// Are attachments enabled?
@@ -72,7 +72,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
72 public void AddRegion(Scene scene) 72 public void AddRegion(Scene scene)
73 { 73 {
74 m_scene = scene; 74 m_scene = scene;
75 m_dialogModule = m_scene.RequestModuleInterface<IDialogModule>();
76 m_scene.RegisterModuleInterface<IAttachmentsModule>(this); 75 m_scene.RegisterModuleInterface<IAttachmentsModule>(this);
77 76
78 if (Enabled) 77 if (Enabled)
@@ -89,7 +88,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
89 m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; 88 m_scene.EventManager.OnNewClient -= SubscribeToClientEvents;
90 } 89 }
91 90
92 public void RegionLoaded(Scene scene) {} 91 public void RegionLoaded(Scene scene)
92 {
93 m_invAccessModule = m_scene.RequestModuleInterface<IInventoryAccessModule>();
94 }
93 95
94 public void Close() 96 public void Close()
95 { 97 {
@@ -629,6 +631,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
629 /// <returns>The user inventory item created that holds the attachment.</returns> 631 /// <returns>The user inventory item created that holds the attachment.</returns>
630 private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IScenePresence sp, SceneObjectGroup grp) 632 private InventoryItemBase AddSceneObjectAsNewAttachmentInInv(IScenePresence sp, SceneObjectGroup grp)
631 { 633 {
634 if (m_invAccessModule == null)
635 return null;
636
632 // m_log.DebugFormat( 637 // m_log.DebugFormat(
633 // "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}", 638 // "[ATTACHMENTS MODULE]: Called AddSceneObjectAsAttachment for object {0} {1} for {2}",
634 // grp.Name, grp.LocalId, remoteClient.Name); 639 // grp.Name, grp.LocalId, remoteClient.Name);
@@ -702,16 +707,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
702 // sets itemID so client can show item as 'attached' in inventory 707 // sets itemID so client can show item as 'attached' in inventory
703 grp.FromItemID = item.ID; 708 grp.FromItemID = item.ID;
704 709
705 if (m_scene.AddInventoryItem(item))
706 {
707 sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0);
708 }
709 else
710 {
711 if (m_dialogModule != null)
712 m_dialogModule.SendAlertToUser(sp.ControllingClient, "Operation failed");
713 }
714
715 return item; 710 return item;
716 } 711 }
717 712
@@ -760,76 +755,75 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
760 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( 755 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
761 IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc) 756 IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc)
762 { 757 {
763 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 758 if (m_invAccessModule == null)
764 if (invAccess != null) 759 return null;
760
761 lock (sp.AttachmentsSyncLock)
765 { 762 {
766 lock (sp.AttachmentsSyncLock) 763 SceneObjectGroup objatt;
764
765 if (itemID != UUID.Zero)
766 objatt = m_invAccessModule.RezObject(sp.ControllingClient,
767 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
768 false, false, sp.UUID, true);
769 else
770 objatt = m_invAccessModule.RezObject(sp.ControllingClient,
771 null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
772 false, false, sp.UUID, true);
773
774 // m_log.DebugFormat(
775 // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}",
776 // objatt.Name, remoteClient.Name, AttachmentPt);
777
778 if (objatt != null)
767 { 779 {
768 SceneObjectGroup objatt; 780 // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller.
769 781 objatt.HasGroupChanged = false;
770 if (itemID != UUID.Zero) 782 bool tainted = false;
771 objatt = invAccess.RezObject(sp.ControllingClient, 783 if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint)
772 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, 784 tainted = true;
773 false, false, sp.UUID, true);
774 else
775 objatt = invAccess.RezObject(sp.ControllingClient,
776 null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
777 false, false, sp.UUID, true);
778
779 // m_log.DebugFormat(
780 // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}",
781 // objatt.Name, remoteClient.Name, AttachmentPt);
782
783 if (objatt != null)
784 {
785 // HasGroupChanged is being set from within RezObject. Ideally it would be set by the caller.
786 objatt.HasGroupChanged = false;
787 bool tainted = false;
788 if (attachmentPt != 0 && attachmentPt != objatt.AttachmentPoint)
789 tainted = true;
790
791 // This will throw if the attachment fails
792 try
793 {
794 AttachObject(sp, objatt, attachmentPt, false);
795 }
796 catch (Exception e)
797 {
798 m_log.ErrorFormat(
799 "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}",
800 objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace);
801
802 // Make sure the object doesn't stick around and bail
803 sp.RemoveAttachment(objatt);
804 m_scene.DeleteSceneObject(objatt, false);
805 return null;
806 }
807
808 if (tainted)
809 objatt.HasGroupChanged = true;
810
811 if (doc != null)
812 {
813 objatt.LoadScriptState(doc);
814 objatt.ResetOwnerChangeFlag();
815 }
816
817 // Fire after attach, so we don't get messy perms dialogs
818 // 4 == AttachedRez
819 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4);
820 objatt.ResumeScripts();
821
822 // Do this last so that event listeners have access to all the effects of the attachment
823 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID);
824 785
825 return objatt; 786 // This will throw if the attachment fails
787 try
788 {
789 AttachObject(sp, objatt, attachmentPt, false);
826 } 790 }
827 else 791 catch (Exception e)
828 { 792 {
829 m_log.WarnFormat( 793 m_log.ErrorFormat(
830 "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}", 794 "[ATTACHMENTS MODULE]: Failed to attach {0} {1} for {2}, exception {3}{4}",
831 itemID, sp.Name, attachmentPt); 795 objatt.Name, objatt.UUID, sp.Name, e.Message, e.StackTrace);
796
797 // Make sure the object doesn't stick around and bail
798 sp.RemoveAttachment(objatt);
799 m_scene.DeleteSceneObject(objatt, false);
800 return null;
832 } 801 }
802
803 if (doc != null)
804 {
805 objatt.LoadScriptState(doc);
806 objatt.ResetOwnerChangeFlag();
807 }
808
809 if (tainted)
810 objatt.HasGroupChanged = true;
811
812 // Fire after attach, so we don't get messy perms dialogs
813 // 4 == AttachedRez
814 objatt.CreateScriptInstances(0, true, m_scene.DefaultScriptEngine, 4);
815 objatt.ResumeScripts();
816
817 // Do this last so that event listeners have access to all the effects of the attachment
818 m_scene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, sp.UUID);
819
820 return objatt;
821 }
822 else
823 {
824 m_log.WarnFormat(
825 "[ATTACHMENTS MODULE]: Could not retrieve item {0} for attaching to avatar {1} at point {2}",
826 itemID, sp.Name, attachmentPt);
833 } 827 }
834 } 828 }
835 829
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
index 42d07fd..5e89eec 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
@@ -99,12 +99,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
99 public void TestAddAttachmentFromGround() 99 public void TestAddAttachmentFromGround()
100 { 100 {
101 TestHelpers.InMethod(); 101 TestHelpers.InMethod();
102// log4net.Config.XmlConfigurator.Configure(); 102// TestHelpers.EnableLogging();
103 103
104 AddPresence(); 104 AddPresence();
105 string attName = "att"; 105 string attName = "att";
106 106
107 SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName).ParentGroup; 107 SceneObjectGroup so = SceneHelpers.AddSceneObject(scene, attName, m_presence.UUID).ParentGroup;
108 108
109 m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false); 109 m_attMod.AttachObject(m_presence, so, (uint)AttachmentPoint.Chest, false);
110 110
@@ -123,6 +123,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
123 Assert.That( 123 Assert.That(
124 m_presence.Appearance.GetAttachpoint(attSo.FromItemID), 124 m_presence.Appearance.GetAttachpoint(attSo.FromItemID),
125 Is.EqualTo((int)AttachmentPoint.Chest)); 125 Is.EqualTo((int)AttachmentPoint.Chest));
126
127 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID));
128 Assert.That(attachmentItem, Is.Not.Null);
129 Assert.That(attachmentItem.Name, Is.EqualTo(attName));
130
131 InventoryFolderBase targetFolder = scene.InventoryService.GetFolderForType(m_presence.UUID, AssetType.Object);
132 Assert.That(attachmentItem.Folder, Is.EqualTo(targetFolder.ID));
133
134// TestHelpers.DisableLogging();
126 } 135 }
127 136
128 [Test] 137 [Test]
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
index 3728b85..06f27e2 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
@@ -415,12 +415,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
415 415
416 protected override void StoreBackwards(UUID friendID, UUID agentID) 416 protected override void StoreBackwards(UUID friendID, UUID agentID)
417 { 417 {
418 Boolean agentIsLocal = true; 418 bool agentIsLocal = true;
419 Boolean friendIsLocal = true; 419// bool friendIsLocal = true;
420
420 if (UserManagementModule != null) 421 if (UserManagementModule != null)
421 { 422 {
422 agentIsLocal = UserManagementModule.IsLocalGridUser(agentID); 423 agentIsLocal = UserManagementModule.IsLocalGridUser(agentID);
423 friendIsLocal = UserManagementModule.IsLocalGridUser(friendID); 424// friendIsLocal = UserManagementModule.IsLocalGridUser(friendID);
424 } 425 }
425 426
426 // Is the requester a local user? 427 // Is the requester a local user?
@@ -507,7 +508,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
507 { 508 {
508 friendUUI = finfo.Friend; 509 friendUUI = finfo.Friend;
509 theFriendUUID = friendUUI; 510 theFriendUUID = friendUUI;
510 UUID utmp = UUID.Zero; String url = String.Empty; String first = String.Empty, last = String.Empty, tmp = String.Empty; 511 UUID utmp = UUID.Zero;
512 string url = String.Empty;
513 string first = String.Empty;
514 string last = String.Empty;
515
511 // If it's confirming the friendship, we already have the full UUI with the secret 516 // If it's confirming the friendship, we already have the full UUI with the secret
512 if (Util.ParseUniversalUserIdentifier(theFriendUUID, out utmp, out url, out first, out last, out secret)) 517 if (Util.ParseUniversalUserIdentifier(theFriendUUID, out utmp, out url, out first, out last, out secret))
513 { 518 {
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index f9e2b2f..5d9d67f 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -46,7 +46,30 @@ using Nini.Config;
46 46
47namespace OpenSim.Region.CoreModules.Framework.EntityTransfer 47namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
48{ 48{
49 public class EntityTransferModule : ISharedRegionModule, IEntityTransferModule 49 /// <summary>
50 /// The possible states that an agent can be in when its being transferred between regions.
51 /// </summary>
52 /// <remarks>
53 /// This is a state machine.
54 ///
55 /// [Entry] => Preparing
56 /// Preparing => { Transferring || CleaningUp || [Exit] }
57 /// Transferring => { ReceivedAtDestination || CleaningUp }
58 /// ReceivedAtDestination => CleaningUp
59 /// CleaningUp => [Exit]
60 ///
61 /// In other words, agents normally travel throwing Preparing => Transferring => ReceivedAtDestination => CleaningUp
62 /// However, any state can transition to CleaningUp if the teleport has failed.
63 /// </remarks>
64 enum AgentTransferState
65 {
66 Preparing, // The agent is being prepared for transfer
67 Transferring, // The agent is in the process of being transferred to a destination
68 ReceivedAtDestination, // The destination has notified us that the agent has been successfully received
69 CleaningUp // The agent is being changed to child/removed after a transfer
70 }
71
72 public class EntityTransferModule : INonSharedRegionModule, IEntityTransferModule
50 { 73 {
51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 74 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
52 75
@@ -65,12 +88,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
65 public bool EnableWaitForCallbackFromTeleportDest { get; set; } 88 public bool EnableWaitForCallbackFromTeleportDest { get; set; }
66 89
67 protected bool m_Enabled = false; 90 protected bool m_Enabled = false;
68 protected Scene m_aScene; 91
69 protected List<Scene> m_Scenes = new List<Scene>(); 92 protected Scene m_scene;
70 protected List<UUID> m_agentsInTransit; 93
94 private Dictionary<UUID, AgentTransferState> m_agentsInTransit;
95
71 private ExpiringCache<UUID, ExpiringCache<ulong, DateTime>> m_bannedRegions = 96 private ExpiringCache<UUID, ExpiringCache<ulong, DateTime>> m_bannedRegions =
72 new ExpiringCache<UUID, ExpiringCache<ulong, DateTime>>(); 97 new ExpiringCache<UUID, ExpiringCache<ulong, DateTime>>();
73 98
99 private IEventQueue m_eqModule;
100
74 #region ISharedRegionModule 101 #region ISharedRegionModule
75 102
76 public Type ReplaceableInterface 103 public Type ReplaceableInterface
@@ -116,7 +143,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
116 MaxTransferDistance = DefaultMaxTransferDistance; 143 MaxTransferDistance = DefaultMaxTransferDistance;
117 } 144 }
118 145
119 m_agentsInTransit = new List<UUID>(); 146 m_agentsInTransit = new Dictionary<UUID, AgentTransferState>();
120 m_Enabled = true; 147 m_Enabled = true;
121 } 148 }
122 149
@@ -129,10 +156,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
129 if (!m_Enabled) 156 if (!m_Enabled)
130 return; 157 return;
131 158
132 if (m_aScene == null) 159 m_scene = scene;
133 m_aScene = scene;
134 160
135 m_Scenes.Add(scene);
136 scene.RegisterModuleInterface<IEntityTransferModule>(this); 161 scene.RegisterModuleInterface<IEntityTransferModule>(this);
137 scene.EventManager.OnNewClient += OnNewClient; 162 scene.EventManager.OnNewClient += OnNewClient;
138 } 163 }
@@ -143,26 +168,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
143 client.OnTeleportLandmarkRequest += RequestTeleportLandmark; 168 client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
144 } 169 }
145 170
146 public virtual void Close() 171 public virtual void Close() {}
147 {
148 if (!m_Enabled)
149 return;
150 }
151
152 public virtual void RemoveRegion(Scene scene)
153 {
154 if (!m_Enabled)
155 return;
156 if (scene == m_aScene)
157 m_aScene = null;
158 172
159 m_Scenes.Remove(scene); 173 public virtual void RemoveRegion(Scene scene) {}
160 }
161 174
162 public virtual void RegionLoaded(Scene scene) 175 public virtual void RegionLoaded(Scene scene)
163 { 176 {
164 if (!m_Enabled) 177 if (!m_Enabled)
165 return; 178 return;
179
180 m_eqModule = m_scene.RequestModuleInterface<IEventQueue>();
166 } 181 }
167 182
168 #endregion 183 #endregion
@@ -230,6 +245,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
230 "[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}", 245 "[ENTITY TRANSFER MODULE]: Teleport for {0} to {1} within {2}",
231 sp.Name, position, sp.Scene.RegionInfo.RegionName); 246 sp.Name, position, sp.Scene.RegionInfo.RegionName);
232 247
248 if (!SetInTransit(sp.UUID))
249 {
250 m_log.DebugFormat(
251 "[ENTITY TRANSFER MODULE]: Ignoring within region teleport request of {0} {1} to {2} - agent is already in transit.",
252 sp.Name, sp.UUID, position);
253
254 return;
255 }
256
233 // Teleport within the same region 257 // Teleport within the same region
234 if (IsOutsideRegion(sp.Scene, position) || position.Z < 0) 258 if (IsOutsideRegion(sp.Scene, position) || position.Z < 0)
235 { 259 {
@@ -258,6 +282,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
258 position.Z = newPosZ; 282 position.Z = newPosZ;
259 } 283 }
260 284
285 UpdateInTransit(sp.UUID, AgentTransferState.Transferring);
286
261 sp.ControllingClient.SendTeleportStart(teleportFlags); 287 sp.ControllingClient.SendTeleportStart(teleportFlags);
262 288
263 sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); 289 sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags);
@@ -265,10 +291,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
265 sp.Velocity = Vector3.Zero; 291 sp.Velocity = Vector3.Zero;
266 sp.Teleport(position); 292 sp.Teleport(position);
267 293
294 UpdateInTransit(sp.UUID, AgentTransferState.ReceivedAtDestination);
295
268 foreach (SceneObjectGroup grp in sp.GetAttachments()) 296 foreach (SceneObjectGroup grp in sp.GetAttachments())
269 { 297 {
270 sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT); 298 sp.Scene.EventManager.TriggerOnScriptChangedEvent(grp.LocalId, (uint)Changed.TELEPORT);
271 } 299 }
300
301 UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
302 ResetFromTransit(sp.UUID);
272 } 303 }
273 304
274 /// <summary> 305 /// <summary>
@@ -286,7 +317,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
286 { 317 {
287 uint x = 0, y = 0; 318 uint x = 0, y = 0;
288 Utils.LongToUInts(regionHandle, out x, out y); 319 Utils.LongToUInts(regionHandle, out x, out y);
289 GridRegion reg = m_aScene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y); 320 GridRegion reg = m_scene.GridService.GetRegionByPosition(sp.Scene.RegionInfo.ScopeID, (int)x, (int)y);
290 321
291 if (reg != null) 322 if (reg != null)
292 { 323 {
@@ -366,33 +397,21 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
366 ScenePresence sp, GridRegion reg, GridRegion finalDestination, 397 ScenePresence sp, GridRegion reg, GridRegion finalDestination,
367 Vector3 position, Vector3 lookAt, uint teleportFlags) 398 Vector3 position, Vector3 lookAt, uint teleportFlags)
368 { 399 {
369 RegionInfo sourceRegion = sp.Scene.RegionInfo; 400 // Record that this agent is in transit so that we can prevent simultaneous requests and do later detection
370 401 // of whether the destination region completes the teleport.
371 if (!IsWithinMaxTeleportDistance(sourceRegion, finalDestination)) 402 if (!SetInTransit(sp.UUID))
372 { 403 {
373 sp.ControllingClient.SendTeleportFailed( 404 m_log.DebugFormat(
374 string.Format( 405 "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.",
375 "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way", 406 sp.Name, sp.UUID, reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position);
376 finalDestination.RegionName, finalDestination.RegionCoordX, finalDestination.RegionCoordY,
377 sourceRegion.RegionName, sourceRegion.RegionLocX, sourceRegion.RegionLocY,
378 MaxTransferDistance));
379 407
380 return; 408 return;
381 } 409 }
382 410
383 IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>();
384
385 if (reg == null || finalDestination == null) 411 if (reg == null || finalDestination == null)
386 { 412 {
387 sp.ControllingClient.SendTeleportFailed("Unable to locate destination"); 413 sp.ControllingClient.SendTeleportFailed("Unable to locate destination");
388 return; 414 ResetFromTransit(sp.UUID);
389 }
390
391 if (!SetInTransit(sp.UUID)) // Avie is already on the way. Caller shouldn't do this.
392 {
393 m_log.DebugFormat(
394 "[ENTITY TRANSFER MODULE]: Ignoring teleport request of {0} {1} to {2} ({3}) {4}/{5} - agent is already in transit.",
395 sp.Name, sp.UUID, reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position);
396 415
397 return; 416 return;
398 } 417 }
@@ -402,6 +421,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
402 sp.Name, sp.UUID, sp.Scene.RegionInfo.RegionName, 421 sp.Name, sp.UUID, sp.Scene.RegionInfo.RegionName,
403 reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); 422 reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position);
404 423
424 RegionInfo sourceRegion = sp.Scene.RegionInfo;
425
426 if (!IsWithinMaxTeleportDistance(sourceRegion, finalDestination))
427 {
428 sp.ControllingClient.SendTeleportFailed(
429 string.Format(
430 "Can't teleport to {0} ({1},{2}) from {3} ({4},{5}), destination is more than {6} regions way",
431 finalDestination.RegionName, finalDestination.RegionCoordX, finalDestination.RegionCoordY,
432 sourceRegion.RegionName, sourceRegion.RegionLocX, sourceRegion.RegionLocY,
433 MaxTransferDistance));
434
435 ResetFromTransit(sp.UUID);
436
437 return;
438 }
439
405 uint newRegionX = (uint)(reg.RegionHandle >> 40); 440 uint newRegionX = (uint)(reg.RegionHandle >> 40);
406 uint newRegionY = (((uint)(reg.RegionHandle)) >> 8); 441 uint newRegionY = (((uint)(reg.RegionHandle)) >> 8);
407 uint oldRegionX = (uint)(sp.Scene.RegionInfo.RegionHandle >> 40); 442 uint oldRegionX = (uint)(sp.Scene.RegionInfo.RegionHandle >> 40);
@@ -415,15 +450,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
415 IPEndPoint endPoint = finalDestination.ExternalEndPoint; 450 IPEndPoint endPoint = finalDestination.ExternalEndPoint;
416 if (endPoint != null && endPoint.Address != null) 451 if (endPoint != null && endPoint.Address != null)
417 { 452 {
418 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from 453 sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down");
419 // both regions 454 ResetFromTransit(sp.UUID);
420 if (sp.ParentID != (uint)0)
421 sp.StandUp();
422 455
423 if (!sp.ValidateAttachments()) 456 return;
424 m_log.DebugFormat( 457 }
425 "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for teleport of {0} from {1} to {2}. Continuing.", 458
426 sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName); 459 if (!sp.ValidateAttachments())
460 m_log.DebugFormat(
461 "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for teleport of {0} from {1} to {2}. Continuing.",
462 sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName);
427 463
428// if (!sp.ValidateAttachments()) 464// if (!sp.ValidateAttachments())
429// { 465// {
@@ -431,212 +467,219 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
431// return; 467// return;
432// } 468// }
433 469
434 string reason; 470 string reason;
435 string version; 471 string version;
436 if (!m_aScene.SimulationService.QueryAccess( 472 if (!m_scene.SimulationService.QueryAccess(
437 finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason)) 473 finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out version, out reason))
438 { 474 {
439 sp.ControllingClient.SendTeleportFailed(reason); 475 sp.ControllingClient.SendTeleportFailed(reason);
440 ResetFromTransit(sp.UUID); 476 ResetFromTransit(sp.UUID);
441 477
442 m_log.DebugFormat( 478 m_log.DebugFormat(
443 "[ENTITY TRANSFER MODULE]: {0} was stopped from teleporting from {1} to {2} because {3}", 479 "[ENTITY TRANSFER MODULE]: {0} was stopped from teleporting from {1} to {2} because {3}",
444 sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); 480 sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason);
445 481
446 return; 482 return;
447 } 483 }
448 484
449 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version); 485 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Destination is running version {0}", version);
450 486
451 sp.ControllingClient.SendTeleportStart(teleportFlags); 487 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from
488 // both regions
489 if (sp.ParentID != (uint)0)
490 sp.StandUp();
452 491
453 // the avatar.Close below will clear the child region list. We need this below for (possibly) 492 sp.ControllingClient.SendTeleportStart(teleportFlags);
454 // closing the child agents, so save it here (we need a copy as it is Clear()-ed).
455 //List<ulong> childRegions = avatar.KnownRegionHandles;
456 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
457 // failure at this point (unlike a border crossing failure). So perhaps this can never fail
458 // once we reach here...
459 //avatar.Scene.RemoveCapsHandler(avatar.UUID);
460 493
461 string capsPath = String.Empty; 494 // the avatar.Close below will clear the child region list. We need this below for (possibly)
495 // closing the child agents, so save it here (we need a copy as it is Clear()-ed).
496 //List<ulong> childRegions = avatar.KnownRegionHandles;
497 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
498 // failure at this point (unlike a border crossing failure). So perhaps this can never fail
499 // once we reach here...
500 //avatar.Scene.RemoveCapsHandler(avatar.UUID);
462 501
463 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); 502 string capsPath = String.Empty;
464 AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo();
465 agentCircuit.startpos = position;
466 agentCircuit.child = true;
467 agentCircuit.Appearance = sp.Appearance;
468 if (currentAgentCircuit != null)
469 {
470 agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs;
471 agentCircuit.IPAddress = currentAgentCircuit.IPAddress;
472 agentCircuit.Viewer = currentAgentCircuit.Viewer;
473 agentCircuit.Channel = currentAgentCircuit.Channel;
474 agentCircuit.Mac = currentAgentCircuit.Mac;
475 agentCircuit.Id0 = currentAgentCircuit.Id0;
476 }
477 503
478 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) 504 AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
479 { 505 AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo();
480 // brand new agent, let's create a new caps seed 506 agentCircuit.startpos = position;
481 agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); 507 agentCircuit.child = true;
482 } 508 agentCircuit.Appearance = sp.Appearance;
509 if (currentAgentCircuit != null)
510 {
511 agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs;
512 agentCircuit.IPAddress = currentAgentCircuit.IPAddress;
513 agentCircuit.Viewer = currentAgentCircuit.Viewer;
514 agentCircuit.Channel = currentAgentCircuit.Channel;
515 agentCircuit.Mac = currentAgentCircuit.Mac;
516 agentCircuit.Id0 = currentAgentCircuit.Id0;
517 }
483 518
484 // Let's create an agent there if one doesn't exist yet. 519 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY))
485 bool logout = false; 520 {
486 if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) 521 // brand new agent, let's create a new caps seed
487 { 522 agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath();
488 sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason)); 523 }
489 ResetFromTransit(sp.UUID);
490 524
491 m_log.DebugFormat( 525 // Let's create an agent there if one doesn't exist yet.
492 "[ENTITY TRANSFER MODULE]: Teleport of {0} from {1} to {2} was refused because {3}", 526 bool logout = false;
493 sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason); 527 if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout))
528 {
529 sp.ControllingClient.SendTeleportFailed(String.Format("Teleport refused: {0}", reason));
530 ResetFromTransit(sp.UUID);
494 531
495 return; 532 m_log.DebugFormat(
496 } 533 "[ENTITY TRANSFER MODULE]: Teleport of {0} from {1} to {2} was refused because {3}",
534 sp.Name, sp.Scene.RegionInfo.RegionName, finalDestination.RegionName, reason);
535
536 return;
537 }
497 538
498 // OK, it got this agent. Let's close some child agents 539 // Past this point we have to attempt clean up if the teleport fails, so update transfer state.
499 sp.CloseChildAgents(newRegionX, newRegionY); 540 UpdateInTransit(sp.UUID, AgentTransferState.Transferring);
500 541
501 IClientIPEndpoint ipepClient; 542 // OK, it got this agent. Let's close some child agents
502 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY)) 543 sp.CloseChildAgents(newRegionX, newRegionY);
544
545 IClientIPEndpoint ipepClient;
546 if (NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY))
547 {
548 //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent...");
549 #region IP Translation for NAT
550 // Uses ipepClient above
551 if (sp.ClientView.TryGet(out ipepClient))
503 { 552 {
504 //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Creating agent..."); 553 endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
505 #region IP Translation for NAT 554 }
506 // Uses ipepClient above 555 #endregion
507 if (sp.ClientView.TryGet(out ipepClient)) 556 capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
508 {
509 endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
510 }
511 #endregion
512 capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
513 557
514 if (eq != null) 558 if (m_eqModule != null)
515 { 559 {
516 eq.EnableSimulator(destinationHandle, endPoint, sp.UUID); 560 m_eqModule.EnableSimulator(destinationHandle, endPoint, sp.UUID);
517 561
518 // ES makes the client send a UseCircuitCode message to the destination, 562 // ES makes the client send a UseCircuitCode message to the destination,
519 // which triggers a bunch of things there. 563 // which triggers a bunch of things there.
520 // So let's wait 564 // So let's wait
521 Thread.Sleep(200); 565 Thread.Sleep(200);
522 566
523 eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); 567 m_eqModule.EstablishAgentCommunication(sp.UUID, endPoint, capsPath);
524 568
525 }
526 else
527 {
528 sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint);
529 }
530 } 569 }
531 else 570 else
532 { 571 {
533 agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle); 572 sp.ControllingClient.InformClientOfNeighbour(destinationHandle, endPoint);
534 capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
535 } 573 }
574 }
575 else
576 {
577 agentCircuit.CapsPath = sp.Scene.CapsModule.GetChildSeed(sp.UUID, reg.RegionHandle);
578 capsPath = finalDestination.ServerURI + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
579 }
536 580
537 // Let's send a full update of the agent. This is a synchronous call. 581 // Let's send a full update of the agent. This is a synchronous call.
538 AgentData agent = new AgentData(); 582 AgentData agent = new AgentData();
539 sp.CopyTo(agent); 583 sp.CopyTo(agent);
540 agent.Position = position; 584 agent.Position = position;
541 SetCallbackURL(agent, sp.Scene.RegionInfo); 585 SetCallbackURL(agent, sp.Scene.RegionInfo);
542 586
543 //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Updating agent..."); 587 //sp.ControllingClient.SendTeleportProgress(teleportFlags, "Updating agent...");
544 588
545 if (!UpdateAgent(reg, finalDestination, agent)) 589 if (!UpdateAgent(reg, finalDestination, agent))
546 { 590 {
547 // Region doesn't take it 591 // Region doesn't take it
548 m_log.WarnFormat( 592 m_log.WarnFormat(
549 "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Returning avatar to source region.", 593 "[ENTITY TRANSFER MODULE]: UpdateAgent failed on teleport of {0} to {1} from {2}. Returning avatar to source region.",
550 sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); 594 sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName);
551 595
552 Fail(sp, finalDestination, logout); 596 Fail(sp, finalDestination, logout);
553 return; 597 return;
554 } 598 }
555 599
556 sp.ControllingClient.SendTeleportProgress(teleportFlags | (uint)TeleportFlags.DisableCancel, "sending_dest"); 600 sp.ControllingClient.SendTeleportProgress(teleportFlags | (uint)TeleportFlags.DisableCancel, "sending_dest");
557 601
558 m_log.DebugFormat( 602 m_log.DebugFormat(
559 "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} from {1} to {2}", 603 "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} from {1} to {2}",
560 capsPath, sp.Scene.RegionInfo.RegionName, sp.Name); 604 capsPath, sp.Scene.RegionInfo.RegionName, sp.Name);
561 605
562 if (eq != null) 606 if (m_eqModule != null)
563 { 607 {
564 eq.TeleportFinishEvent(destinationHandle, 13, endPoint, 608 m_eqModule.TeleportFinishEvent(destinationHandle, 13, endPoint, 0, teleportFlags, capsPath, sp.UUID);
565 0, teleportFlags, capsPath, sp.UUID); 609 }
566 } 610 else
567 else 611 {
568 { 612 sp.ControllingClient.SendRegionTeleport(destinationHandle, 13, endPoint, 4,
569 sp.ControllingClient.SendRegionTeleport(destinationHandle, 13, endPoint, 4, 613 teleportFlags, capsPath);
570 teleportFlags, capsPath); 614 }
571 }
572 615
573 // Let's set this to true tentatively. This does not trigger OnChildAgent 616 // Let's set this to true tentatively. This does not trigger OnChildAgent
574 sp.IsChildAgent = true; 617 sp.IsChildAgent = true;
575 618
576 // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which 619 // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which
577 // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation 620 // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation
578 // that the client contacted the destination before we close things here. 621 // that the client contacted the destination before we close things here.
579 if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID)) 622 if (EnableWaitForCallbackFromTeleportDest && !WaitForCallback(sp.UUID))
580 { 623 {
581 m_log.WarnFormat( 624 m_log.WarnFormat(
582 "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.", 625 "[ENTITY TRANSFER MODULE]: Teleport of {0} to {1} from {2} failed due to no callback from destination region. Returning avatar to source region.",
583 sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName); 626 sp.Name, finalDestination.RegionName, sp.Scene.RegionInfo.RegionName);
584 627
585 Fail(sp, finalDestination, logout); 628 Fail(sp, finalDestination, logout);
586 return; 629 return;
587 } 630 }
588 631
589 // For backwards compatibility 632 UpdateInTransit(sp.UUID, AgentTransferState.CleaningUp);
590 if (version == "Unknown" || version == string.Empty)
591 {
592 // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it
593 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one...");
594 CrossAttachmentsIntoNewRegion(finalDestination, sp, true);
595 }
596 633
597 // May need to logout or other cleanup 634 // For backwards compatibility
598 AgentHasMovedAway(sp, logout); 635 if (version == "Unknown" || version == string.Empty)
636 {
637 // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it
638 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Old simulator, sending attachments one by one...");
639 CrossAttachmentsIntoNewRegion(finalDestination, sp, true);
640 }
599 641
600 // Well, this is it. The agent is over there. 642 // May need to logout or other cleanup
601 KillEntity(sp.Scene, sp.LocalId); 643 AgentHasMovedAway(sp, logout);
602 644
603 // Now let's make it officially a child agent 645 // Well, this is it. The agent is over there.
604 sp.MakeChildAgent(); 646 KillEntity(sp.Scene, sp.LocalId);
647
648 // Now let's make it officially a child agent
649 sp.MakeChildAgent();
605 650
606// sp.Scene.CleanDroppedAttachments(); 651// sp.Scene.CleanDroppedAttachments();
607 652
608 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone 653 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
609 654
610 if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) 655 if (NeedsClosing(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY, reg))
611 { 656 {
612 // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before 657 // We need to delay here because Imprudence viewers, unlike v1 or v3, have a short (<200ms, <500ms) delay before
613 // they regard the new region as the current region after receiving the AgentMovementComplete 658 // they regard the new region as the current region after receiving the AgentMovementComplete
614 // response. If close is sent before then, it will cause the viewer to quit instead. 659 // response. If close is sent before then, it will cause the viewer to quit instead.
615 // However, if this delay is longer, then a viewer can teleport back to this region and experience 660 //
616 // a failure because the old ScenePresence has not yet been cleaned up. 661 // This sleep can be increased if necessary. However, whilst it's active,
617 Thread.Sleep(2000); 662 // an agent cannot teleport back to this region if it has teleported away.
618 663 Thread.Sleep(2000);
619 sp.Close();
620 sp.Scene.IncomingCloseAgent(sp.UUID);
621 }
622 else
623 {
624 // now we have a child agent in this region.
625 sp.Reset();
626 }
627 664
628 // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! 665 sp.Close();
629 if (sp.Scene.NeedSceneCacheClear(sp.UUID)) 666 sp.Scene.IncomingCloseAgent(sp.UUID);
630 {
631 m_log.DebugFormat(
632 "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed",
633 sp.UUID);
634 }
635 } 667 }
636 else 668 else
637 { 669 {
638 sp.ControllingClient.SendTeleportFailed("Remote Region appears to be down"); 670 // now we have a child agent in this region.
671 sp.Reset();
672 }
673
674 // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
675 if (sp.Scene.NeedSceneCacheClear(sp.UUID))
676 {
677 m_log.DebugFormat(
678 "[ENTITY TRANSFER MODULE]: User {0} is going to another region, profile cache removed",
679 sp.UUID);
639 } 680 }
681
682 ResetFromTransit(sp.UUID);
640 } 683 }
641 684
642 protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout) 685 protected virtual void Fail(ScenePresence sp, GridRegion finalDestination, bool logout)
@@ -652,7 +695,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
652 EnableChildAgents(sp); 695 EnableChildAgents(sp);
653 696
654 // Finally, kill the agent we just created at the destination. 697 // Finally, kill the agent we just created at the destination.
655 m_aScene.SimulationService.CloseAgent(finalDestination, sp.UUID); 698 m_scene.SimulationService.CloseAgent(finalDestination, sp.UUID);
656 699
657 sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout); 700 sp.Scene.EventManager.TriggerTeleportFail(sp.ControllingClient, logout);
658 } 701 }
@@ -660,7 +703,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
660 protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout) 703 protected virtual bool CreateAgent(ScenePresence sp, GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason, out bool logout)
661 { 704 {
662 logout = false; 705 logout = false;
663 bool success = m_aScene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason); 706 bool success = m_scene.SimulationService.CreateAgent(finalDestination, agentCircuit, teleportFlags, out reason);
664 707
665 if (success) 708 if (success)
666 sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout); 709 sp.Scene.EventManager.TriggerTeleportStart(sp.ControllingClient, reg, finalDestination, teleportFlags, logout);
@@ -670,7 +713,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
670 713
671 protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent) 714 protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent)
672 { 715 {
673 return m_aScene.SimulationService.UpdateAgent(finalDestination, agent); 716 return m_scene.SimulationService.UpdateAgent(finalDestination, agent);
674 } 717 }
675 718
676 protected virtual void SetCallbackURL(AgentData agent, RegionInfo region) 719 protected virtual void SetCallbackURL(AgentData agent, RegionInfo region)
@@ -722,7 +765,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
722 return false; 765 return false;
723 } 766 }
724 767
725
726 #endregion 768 #endregion
727 769
728 #region Landmark Teleport 770 #region Landmark Teleport
@@ -734,7 +776,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
734 /// <param name="position"></param> 776 /// <param name="position"></param>
735 public virtual void RequestTeleportLandmark(IClientAPI remoteClient, AssetLandmark lm) 777 public virtual void RequestTeleportLandmark(IClientAPI remoteClient, AssetLandmark lm)
736 { 778 {
737 GridRegion info = m_aScene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); 779 GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID);
738 780
739 if (info == null) 781 if (info == null)
740 { 782 {
@@ -760,8 +802,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
760 m_log.DebugFormat( 802 m_log.DebugFormat(
761 "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); 803 "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId);
762 804
763 //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_aScene.PresenceService.GetAgent(client.SessionId); 805 //OpenSim.Services.Interfaces.PresenceInfo pinfo = m_scene.PresenceService.GetAgent(client.SessionId);
764 GridUserInfo uinfo = m_aScene.GridUserService.GetGridUserInfo(client.AgentId.ToString()); 806 GridUserInfo uinfo = m_scene.GridUserService.GetGridUserInfo(client.AgentId.ToString());
765 807
766 if (uinfo != null) 808 if (uinfo != null)
767 { 809 {
@@ -771,7 +813,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
771 client.SendTeleportFailed("You don't have a home position set."); 813 client.SendTeleportFailed("You don't have a home position set.");
772 return false; 814 return false;
773 } 815 }
774 GridRegion regionInfo = m_aScene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID); 816 GridRegion regionInfo = m_scene.GridService.GetRegionByUUID(UUID.Zero, uinfo.HomeRegionID);
775 if (regionInfo == null) 817 if (regionInfo == null)
776 { 818 {
777 // can't find the Home region: Tell viewer and abort 819 // can't find the Home region: Tell viewer and abort
@@ -1016,107 +1058,123 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1016 ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion, 1058 ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, GridRegion neighbourRegion,
1017 bool isFlying, string version) 1059 bool isFlying, string version)
1018 { 1060 {
1061 if (neighbourRegion == null)
1062 return agent;
1063
1019 try 1064 try
1020 { 1065 {
1066 SetInTransit(agent.UUID);
1067
1021 ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize)); 1068 ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize));
1022 1069
1023 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}", agent.Firstname, agent.Lastname, neighbourx, neighboury, version); 1070 m_log.DebugFormat(
1071 "[ENTITY TRANSFER MODULE]: Crossing agent {0} {1} to {2}-{3} running version {4}",
1072 agent.Firstname, agent.Lastname, neighbourx, neighboury, version);
1024 1073
1025 Scene m_scene = agent.Scene; 1074 Scene m_scene = agent.Scene;
1026
1027 if (neighbourRegion != null)
1028 {
1029 if (!agent.ValidateAttachments())
1030 m_log.DebugFormat(
1031 "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.",
1032 agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName);
1033 1075
1034 pos = pos + agent.Velocity; 1076 if (!agent.ValidateAttachments())
1035 Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0); 1077 m_log.DebugFormat(
1078 "[ENTITY TRANSFER MODULE]: Failed validation of all attachments for region crossing of {0} from {1} to {2}. Continuing.",
1079 agent.Name, agent.Scene.RegionInfo.RegionName, neighbourRegion.RegionName);
1036 1080
1037 agent.RemoveFromPhysicalScene(); 1081 pos = pos + agent.Velocity;
1038 SetInTransit(agent.UUID); 1082 Vector3 vel2 = new Vector3(agent.Velocity.X, agent.Velocity.Y, 0);
1039 1083
1040 AgentData cAgent = new AgentData(); 1084 agent.RemoveFromPhysicalScene();
1041 agent.CopyTo(cAgent);
1042 cAgent.Position = pos;
1043 if (isFlying)
1044 cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
1045 1085
1046 // We don't need the callback anymnore 1086 AgentData cAgent = new AgentData();
1047 cAgent.CallbackURI = String.Empty; 1087 agent.CopyTo(cAgent);
1088 cAgent.Position = pos;
1089 if (isFlying)
1090 cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
1048 1091
1049 if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent)) 1092 // We don't need the callback anymnore
1050 { 1093 cAgent.CallbackURI = String.Empty;
1051 // region doesn't take it
1052 ReInstantiateScripts(agent);
1053 agent.AddToPhysicalScene(isFlying);
1054 ResetFromTransit(agent.UUID);
1055 return agent;
1056 }
1057
1058 //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
1059 agent.ControllingClient.RequestClientInfo();
1060
1061 //m_log.Debug("BEFORE CROSS");
1062 //Scene.DumpChildrenSeeds(UUID);
1063 //DumpKnownRegions();
1064 string agentcaps;
1065 if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps))
1066 {
1067 m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.",
1068 neighbourRegion.RegionHandle);
1069 return agent;
1070 }
1071 // No turning back
1072 agent.IsChildAgent = true;
1073 1094
1074 string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps); 1095 // Beyond this point, extra cleanup is needed beyond removing transit state
1075 1096 UpdateInTransit(agent.UUID, AgentTransferState.Transferring);
1076 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
1077 1097
1078 IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>(); 1098 if (!m_scene.SimulationService.UpdateAgent(neighbourRegion, cAgent))
1079 if (eq != null) 1099 {
1080 { 1100 // region doesn't take it
1081 eq.CrossRegion(neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint, 1101 UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp);
1082 capsPath, agent.UUID, agent.ControllingClient.SessionId);
1083 }
1084 else
1085 {
1086 agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
1087 capsPath);
1088 }
1089 1102
1090 // SUCCESS! 1103 ReInstantiateScripts(agent);
1091 agent.MakeChildAgent(); 1104 agent.AddToPhysicalScene(isFlying);
1092 ResetFromTransit(agent.UUID); 1105 ResetFromTransit(agent.UUID);
1093 1106
1094 // now we have a child agent in this region. Request all interesting data about other (root) agents 1107 return agent;
1095 agent.SendOtherAgentsAvatarDataToMe(); 1108 }
1096 agent.SendOtherAgentsAppearanceToMe();
1097 1109
1098 // Backwards compatibility. Best effort 1110 //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
1099 if (version == "Unknown" || version == string.Empty) 1111 agent.ControllingClient.RequestClientInfo();
1100 {
1101 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one...");
1102 Thread.Sleep(3000); // wait a little now that we're not waiting for the callback
1103 CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
1104 }
1105 1112
1113 //m_log.Debug("BEFORE CROSS");
1114 //Scene.DumpChildrenSeeds(UUID);
1115 //DumpKnownRegions();
1116 string agentcaps;
1117 if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps))
1118 {
1119 m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: No ENTITY TRANSFER MODULE information for region handle {0}, exiting CrossToNewRegion.",
1120 neighbourRegion.RegionHandle);
1121 return agent;
1122 }
1123 // No turning back
1124 agent.IsChildAgent = true;
1106 1125
1107 // Next, let's close the child agent connections that are too far away. 1126 string capsPath = neighbourRegion.ServerURI + CapsUtil.GetCapsSeedPath(agentcaps);
1108 agent.CloseChildAgents(neighbourx, neighboury); 1127
1109 1128 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
1110 AgentHasMovedAway(agent, false); 1129
1111 1130 if (m_eqModule != null)
1112 // the user may change their profile information in other region, 1131 {
1113 // so the userinfo in UserProfileCache is not reliable any more, delete it 1132 m_eqModule.CrossRegion(
1114 // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE! 1133 neighbourHandle, pos, vel2 /* agent.Velocity */, neighbourRegion.ExternalEndPoint,
1115 if (agent.Scene.NeedSceneCacheClear(agent.UUID)) 1134 capsPath, agent.UUID, agent.ControllingClient.SessionId);
1116 { 1135 }
1117 m_log.DebugFormat( 1136 else
1118 "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID); 1137 {
1119 } 1138 agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
1139 capsPath);
1140 }
1141
1142 // SUCCESS!
1143 UpdateInTransit(agent.UUID, AgentTransferState.ReceivedAtDestination);
1144
1145 // Unlike a teleport, here we do not wait for the destination region to confirm the receipt.
1146 UpdateInTransit(agent.UUID, AgentTransferState.CleaningUp);
1147
1148 agent.MakeChildAgent();
1149
1150 // FIXME: Possibly this should occur lower down after other commands to close other agents,
1151 // but not sure yet what the side effects would be.
1152 ResetFromTransit(agent.UUID);
1153
1154 // now we have a child agent in this region. Request all interesting data about other (root) agents
1155 agent.SendOtherAgentsAvatarDataToMe();
1156 agent.SendOtherAgentsAppearanceToMe();
1157
1158 // Backwards compatibility. Best effort
1159 if (version == "Unknown" || version == string.Empty)
1160 {
1161 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: neighbor with old version, passing attachments one by one...");
1162 Thread.Sleep(3000); // wait a little now that we're not waiting for the callback
1163 CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
1164 }
1165
1166 // Next, let's close the child agent connections that are too far away.
1167 agent.CloseChildAgents(neighbourx, neighboury);
1168
1169 AgentHasMovedAway(agent, false);
1170
1171 // the user may change their profile information in other region,
1172 // so the userinfo in UserProfileCache is not reliable any more, delete it
1173 // REFACTORING PROBLEM. Well, not a problem, but this method is HORRIBLE!
1174 if (agent.Scene.NeedSceneCacheClear(agent.UUID))
1175 {
1176 m_log.DebugFormat(
1177 "[ENTITY TRANSFER MODULE]: User {0} is going to another region", agent.UUID);
1120 } 1178 }
1121 1179
1122 //m_log.Debug("AFTER CROSS"); 1180 //m_log.Debug("AFTER CROSS");
@@ -1128,11 +1186,13 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1128 m_log.ErrorFormat( 1186 m_log.ErrorFormat(
1129 "[ENTITY TRANSFER MODULE]: Problem crossing user {0} to new region {1} from {2}. Exception {3}{4}", 1187 "[ENTITY TRANSFER MODULE]: Problem crossing user {0} to new region {1} from {2}. Exception {3}{4}",
1130 agent.Name, neighbourRegion.RegionName, agent.Scene.RegionInfo.RegionName, e.Message, e.StackTrace); 1188 agent.Name, neighbourRegion.RegionName, agent.Scene.RegionInfo.RegionName, e.Message, e.StackTrace);
1189
1190 // TODO: Might be worth attempting other restoration here such as reinstantiation of scripts, etc.
1131 } 1191 }
1132 1192
1133 return agent; 1193 return agent;
1134 } 1194 }
1135 1195
1136 private void CrossAgentToNewRegionCompleted(IAsyncResult iar) 1196 private void CrossAgentToNewRegionCompleted(IAsyncResult iar)
1137 { 1197 {
1138 CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState; 1198 CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState;
@@ -1431,8 +1491,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1431 1491
1432 if (regionAccepted && newAgent) 1492 if (regionAccepted && newAgent)
1433 { 1493 {
1434 IEventQueue eq = sp.Scene.RequestModuleInterface<IEventQueue>(); 1494 if (m_eqModule != null)
1435 if (eq != null)
1436 { 1495 {
1437 #region IP Translation for NAT 1496 #region IP Translation for NAT
1438 IClientIPEndpoint ipepClient; 1497 IClientIPEndpoint ipepClient;
@@ -1446,8 +1505,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1446 "and EstablishAgentCommunication with seed cap {4}", 1505 "and EstablishAgentCommunication with seed cap {4}",
1447 scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath); 1506 scene.RegionInfo.RegionName, sp.Name, reg.RegionName, reg.RegionHandle, capsPath);
1448 1507
1449 eq.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID); 1508 m_eqModule.EnableSimulator(reg.RegionHandle, endPoint, sp.UUID);
1450 eq.EstablishAgentCommunication(sp.UUID, endPoint, capsPath); 1509 m_eqModule.EstablishAgentCommunication(sp.UUID, endPoint, capsPath);
1451 } 1510 }
1452 else 1511 else
1453 { 1512 {
@@ -1573,8 +1632,37 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1573 #region Agent Arrived 1632 #region Agent Arrived
1574 public void AgentArrivedAtDestination(UUID id) 1633 public void AgentArrivedAtDestination(UUID id)
1575 { 1634 {
1576 m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Agent {0} released", id); 1635 lock (m_agentsInTransit)
1577 ResetFromTransit(id); 1636 {
1637 if (!m_agentsInTransit.ContainsKey(id))
1638 {
1639 m_log.WarnFormat(
1640 "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but no teleport request is active",
1641 m_scene.RegionInfo.RegionName, id);
1642
1643 return;
1644 }
1645
1646 AgentTransferState currentState = m_agentsInTransit[id];
1647
1648 if (currentState == AgentTransferState.ReceivedAtDestination)
1649 {
1650 // An anomoly but don't make this an outright failure - destination region could be overzealous in sending notification.
1651 m_log.WarnFormat(
1652 "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but notification has already previously been received",
1653 m_scene.RegionInfo.RegionName, id);
1654 }
1655 else if (currentState != AgentTransferState.Transferring)
1656 {
1657 m_log.ErrorFormat(
1658 "[ENTITY TRANSFER MODULE]: Region {0} received notification of arrival in destination scene of agent {1} but agent is in transfer state {2}",
1659 m_scene.RegionInfo.RegionName, id, currentState);
1660
1661 return;
1662 }
1663
1664 m_agentsInTransit[id] = AgentTransferState.ReceivedAtDestination;
1665 }
1578 } 1666 }
1579 1667
1580 #endregion 1668 #endregion
@@ -1845,8 +1933,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1845 //// And the new channel... 1933 //// And the new channel...
1846 //if (m_interregionCommsOut != null) 1934 //if (m_interregionCommsOut != null)
1847 // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); 1935 // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true);
1848 if (m_aScene.SimulationService != null) 1936 if (m_scene.SimulationService != null)
1849 successYN = m_aScene.SimulationService.CreateObject(destination, newPosition, grp, true); 1937 successYN = m_scene.SimulationService.CreateObject(destination, newPosition, grp, true);
1850 1938
1851 if (successYN) 1939 if (successYN)
1852 { 1940 {
@@ -1925,10 +2013,29 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1925 2013
1926 #region Misc 2014 #region Misc
1927 2015
1928 protected bool WaitForCallback(UUID id) 2016 private bool WaitForCallback(UUID id)
1929 { 2017 {
2018 lock (m_agentsInTransit)
2019 {
2020 if (!IsInTransit(id))
2021 throw new Exception(
2022 string.Format(
2023 "Asked to wait for destination callback for agent with ID {0} but it is not in transit"));
2024
2025 AgentTransferState currentState = m_agentsInTransit[id];
2026
2027 if (currentState != AgentTransferState.Transferring && currentState != AgentTransferState.ReceivedAtDestination)
2028 throw new Exception(
2029 string.Format(
2030 "Asked to wait for destination callback for agent with ID {0} but it is in state {1}",
2031 currentState));
2032 }
2033
1930 int count = 200; 2034 int count = 200;
1931 while (m_agentsInTransit.Contains(id) && count-- > 0) 2035
2036 // There should be no race condition here since no other code should be removing the agent transfer or
2037 // changing the state to another other than Transferring => ReceivedAtDestination.
2038 while (m_agentsInTransit[id] != AgentTransferState.ReceivedAtDestination && count-- > 0)
1932 { 2039 {
1933// m_log.Debug(" >>> Waiting... " + count); 2040// m_log.Debug(" >>> Waiting... " + count);
1934 Thread.Sleep(100); 2041 Thread.Sleep(100);
@@ -1938,17 +2045,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1938 } 2045 }
1939 2046
1940 /// <summary> 2047 /// <summary>
1941 /// Set that an agent is in the process of being teleported. 2048 /// Set that an agent is in transit.
1942 /// </summary> 2049 /// </summary>
1943 /// <param name='id'>The ID of the agent being teleported</param> 2050 /// <param name='id'>The ID of the agent being teleported</param>
1944 /// <returns>true if the agent was not already in transit, false if it was</returns> 2051 /// <returns>true if the agent was not already in transit, false if it was</returns>
1945 protected bool SetInTransit(UUID id) 2052 private bool SetInTransit(UUID id)
1946 { 2053 {
1947 lock (m_agentsInTransit) 2054 lock (m_agentsInTransit)
1948 { 2055 {
1949 if (!m_agentsInTransit.Contains(id)) 2056 if (!m_agentsInTransit.ContainsKey(id))
1950 { 2057 {
1951 m_agentsInTransit.Add(id); 2058 m_agentsInTransit[id] = AgentTransferState.Preparing;
1952 return true; 2059 return true;
1953 } 2060 }
1954 } 2061 }
@@ -1957,34 +2064,87 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
1957 } 2064 }
1958 2065
1959 /// <summary> 2066 /// <summary>
1960 /// Show whether the given agent is being teleported. 2067 /// Updates the state of an agent that is already in transit.
1961 /// </summary> 2068 /// </summary>
1962 /// <returns>true if the agent is in the process of being teleported, false otherwise.</returns> 2069 /// <param name='id'></param>
1963 /// <param name='id'>The agent ID</para></param> 2070 /// <param name='newState'></param>
1964 protected bool IsInTransit(UUID id) 2071 /// <returns></returns>
2072 /// <exception cref='Exception'>Illegal transitions will throw an Exception</exception>
2073 private void UpdateInTransit(UUID id, AgentTransferState newState)
2074 {
2075 lock (m_agentsInTransit)
2076 {
2077 // Illegal to try and update an agent that's not actually in transit.
2078 if (!m_agentsInTransit.ContainsKey(id))
2079 throw new Exception(string.Format("Agent with ID {0} is not registered as in transit", id));
2080
2081 AgentTransferState oldState = m_agentsInTransit[id];
2082
2083 bool transitionOkay = false;
2084
2085 if (newState == AgentTransferState.CleaningUp && oldState != AgentTransferState.CleaningUp)
2086 transitionOkay = true;
2087 else if (newState == AgentTransferState.Transferring && oldState == AgentTransferState.Preparing)
2088 transitionOkay = true;
2089 else if (newState == AgentTransferState.ReceivedAtDestination && oldState == AgentTransferState.Transferring)
2090 transitionOkay = true;
2091
2092 if (transitionOkay)
2093 m_agentsInTransit[id] = newState;
2094 else
2095 throw new Exception(
2096 string.Format(
2097 "Agent with ID {0} is not allowed to move from old transit state {1} to new state {2}",
2098 id, oldState, newState));
2099 }
2100 }
2101
2102 public bool IsInTransit(UUID id)
1965 { 2103 {
1966 lock (m_agentsInTransit) 2104 lock (m_agentsInTransit)
1967 return m_agentsInTransit.Contains(id); 2105 return m_agentsInTransit.ContainsKey(id);
1968 } 2106 }
1969 2107
1970 /// <summary> 2108 /// <summary>
1971 /// Set that an agent is no longer being teleported. 2109 /// Removes an agent from the transit state machine.
1972 /// </summary> 2110 /// </summary>
1973 /// <returns></returns> 2111 /// <param name='id'></param>
1974 /// <param name='id'> 2112 /// <returns>true if the agent was flagged as being teleported when this method was called, false otherwise</returns>
1975 /// true if the agent was flagged as being teleported when this method was called, false otherwise 2113 private bool ResetFromTransit(UUID id)
1976 /// </param>
1977 protected bool ResetFromTransit(UUID id)
1978 { 2114 {
1979 lock (m_agentsInTransit) 2115 lock (m_agentsInTransit)
1980 { 2116 {
1981 if (m_agentsInTransit.Contains(id)) 2117 if (m_agentsInTransit.ContainsKey(id))
1982 { 2118 {
2119 AgentTransferState state = m_agentsInTransit[id];
2120
2121 if (state == AgentTransferState.Transferring || state == AgentTransferState.ReceivedAtDestination)
2122 {
2123 // FIXME: For now, we allow exit from any state since a thrown exception in teleport is now guranteed
2124 // to be handled properly - ResetFromTransit() could be invoked at any step along the process
2125 m_log.WarnFormat(
2126 "[ENTITY TRANSFER MODULE]: Agent with ID should not exit directly from state {1}, should go to {2} state first",
2127 state, AgentTransferState.CleaningUp);
2128
2129// throw new Exception(
2130// "Agent with ID {0} cannot exit directly from state {1}, it must go to {2} state first",
2131// state, AgentTransferState.CleaningUp);
2132 }
2133
1983 m_agentsInTransit.Remove(id); 2134 m_agentsInTransit.Remove(id);
2135
2136 m_log.DebugFormat(
2137 "[ENTITY TRANSFER MODULE]: Agent {0} cleared from transit in {1}",
2138 id, m_scene.RegionInfo.RegionName);
2139
1984 return true; 2140 return true;
1985 } 2141 }
1986 } 2142 }
1987 2143
2144 m_log.WarnFormat(
2145 "[ENTITY TRANSFER MODULE]: Agent {0} requested to clear from transit in {1} but was already cleared.",
2146 id, m_scene.RegionInfo.RegionName);
2147
1988 return false; 2148 return false;
1989 } 2149 }
1990 2150
@@ -2015,4 +2175,4 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
2015 #endregion 2175 #endregion
2016 2176
2017 } 2177 }
2018} \ No newline at end of file 2178}
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
index 6e27299..44ea2b1 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/HGEntityTransferModule.cs
@@ -45,11 +45,11 @@ using Nini.Config;
45 45
46namespace OpenSim.Region.CoreModules.Framework.EntityTransfer 46namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
47{ 47{
48 public class HGEntityTransferModule : EntityTransferModule, ISharedRegionModule, IEntityTransferModule, IUserAgentVerificationModule 48 public class HGEntityTransferModule
49 : EntityTransferModule, INonSharedRegionModule, IEntityTransferModule, IUserAgentVerificationModule
49 { 50 {
50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 51 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51 52
52 private bool m_Initialized = false;
53 private int m_levelHGTeleport = 0; 53 private int m_levelHGTeleport = 0;
54 54
55 private GatekeeperServiceConnector m_GatekeeperConnector; 55 private GatekeeperServiceConnector m_GatekeeperConnector;
@@ -64,6 +64,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
64 public override void Initialise(IConfigSource source) 64 public override void Initialise(IConfigSource source)
65 { 65 {
66 IConfig moduleConfig = source.Configs["Modules"]; 66 IConfig moduleConfig = source.Configs["Modules"];
67
67 if (moduleConfig != null) 68 if (moduleConfig != null)
68 { 69 {
69 string name = moduleConfig.GetString("EntityTransferModule", ""); 70 string name = moduleConfig.GetString("EntityTransferModule", "");
@@ -82,10 +83,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
82 public override void AddRegion(Scene scene) 83 public override void AddRegion(Scene scene)
83 { 84 {
84 base.AddRegion(scene); 85 base.AddRegion(scene);
86
85 if (m_Enabled) 87 if (m_Enabled)
86 {
87 scene.RegisterModuleInterface<IUserAgentVerificationModule>(this); 88 scene.RegisterModuleInterface<IUserAgentVerificationModule>(this);
88 }
89 } 89 }
90 90
91 protected override void OnNewClient(IClientAPI client) 91 protected override void OnNewClient(IClientAPI client)
@@ -98,33 +98,28 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
98 public override void RegionLoaded(Scene scene) 98 public override void RegionLoaded(Scene scene)
99 { 99 {
100 base.RegionLoaded(scene); 100 base.RegionLoaded(scene);
101 if (m_Enabled)
102 if (!m_Initialized)
103 {
104 m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService);
105 m_Initialized = true;
106
107 }
108 101
102 if (m_Enabled)
103 m_GatekeeperConnector = new GatekeeperServiceConnector(scene.AssetService);
109 } 104 }
105
110 public override void RemoveRegion(Scene scene) 106 public override void RemoveRegion(Scene scene)
111 { 107 {
112 base.AddRegion(scene); 108 base.AddRegion(scene);
109
113 if (m_Enabled) 110 if (m_Enabled)
114 {
115 scene.UnregisterModuleInterface<IUserAgentVerificationModule>(this); 111 scene.UnregisterModuleInterface<IUserAgentVerificationModule>(this);
116 }
117 } 112 }
118 113
119
120 #endregion 114 #endregion
121 115
122 #region HG overrides of IEntiryTransferModule 116 #region HG overrides of IEntiryTransferModule
123 117
124 protected override GridRegion GetFinalDestination(GridRegion region) 118 protected override GridRegion GetFinalDestination(GridRegion region)
125 { 119 {
126 int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, region.RegionID); 120 int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, region.RegionID);
127 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionID, flags); 121 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: region {0} flags: {1}", region.RegionID, flags);
122
128 if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) 123 if ((flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0)
129 { 124 {
130 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region {0} is hyperlink", region.RegionID); 125 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Destination region {0} is hyperlink", region.RegionID);
@@ -135,6 +130,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
135 m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: GetHyperlinkRegion to Gatekeeper {0} failed", region.ServerURI); 130 m_log.WarnFormat("[HG ENTITY TRANSFER MODULE]: GetHyperlinkRegion to Gatekeeper {0} failed", region.ServerURI);
136 return real_destination; 131 return real_destination;
137 } 132 }
133
138 return region; 134 return region;
139 } 135 }
140 136
@@ -143,7 +139,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
143 if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg)) 139 if (base.NeedsClosing(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY, reg))
144 return true; 140 return true;
145 141
146 int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); 142 int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, reg.RegionID);
147 if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) 143 if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0)
148 return true; 144 return true;
149 145
@@ -156,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
156 if (logout) 152 if (logout)
157 { 153 {
158 // Log them out of this grid 154 // Log them out of this grid
159 m_aScene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId); 155 m_scene.PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
160 } 156 }
161 } 157 }
162 158
@@ -165,7 +161,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
165 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: CreateAgent {0} {1}", reg.ServerURI, finalDestination.ServerURI); 161 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: CreateAgent {0} {1}", reg.ServerURI, finalDestination.ServerURI);
166 reason = string.Empty; 162 reason = string.Empty;
167 logout = false; 163 logout = false;
168 int flags = m_aScene.GridService.GetRegionFlags(m_aScene.RegionInfo.ScopeID, reg.RegionID); 164 int flags = m_scene.GridService.GetRegionFlags(m_scene.RegionInfo.ScopeID, reg.RegionID);
169 if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0) 165 if (flags == -1 /* no region in DB */ || (flags & (int)OpenSim.Data.RegionFlags.Hyperlink) != 0)
170 { 166 {
171 // this user is going to another grid 167 // this user is going to another grid
@@ -210,7 +206,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
210 "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId); 206 "[ENTITY TRANSFER MODULE]: Request to teleport {0} {1} home", client.Name, client.AgentId);
211 207
212 // Let's find out if this is a foreign user or a local user 208 // Let's find out if this is a foreign user or a local user
213 IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>(); 209 IUserManagement uMan = m_scene.RequestModuleInterface<IUserManagement>();
214 if (uMan != null && uMan.IsLocalGridUser(id)) 210 if (uMan != null && uMan.IsLocalGridUser(id))
215 { 211 {
216 // local grid user 212 // local grid user
@@ -265,19 +261,21 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
265 { 261 {
266 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Teleporting agent via landmark to {0} region {1} position {2}", 262 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Teleporting agent via landmark to {0} region {1} position {2}",
267 (lm.Gatekeeper == string.Empty) ? "local" : lm.Gatekeeper, lm.RegionID, lm.Position); 263 (lm.Gatekeeper == string.Empty) ? "local" : lm.Gatekeeper, lm.RegionID, lm.Position);
264
268 if (lm.Gatekeeper == string.Empty) 265 if (lm.Gatekeeper == string.Empty)
269 { 266 {
270 base.RequestTeleportLandmark(remoteClient, lm); 267 base.RequestTeleportLandmark(remoteClient, lm);
271 return; 268 return;
272 } 269 }
273 270
274 GridRegion info = m_aScene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID); 271 GridRegion info = m_scene.GridService.GetRegionByUUID(UUID.Zero, lm.RegionID);
275 272
276 // Local region? 273 // Local region?
277 if (info != null) 274 if (info != null)
278 { 275 {
279 ((Scene)(remoteClient.Scene)).RequestTeleportLocation(remoteClient, info.RegionHandle, lm.Position, 276 ((Scene)(remoteClient.Scene)).RequestTeleportLocation(remoteClient, info.RegionHandle, lm.Position,
280 Vector3.Zero, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark)); 277 Vector3.Zero, (uint)(Constants.TeleportFlags.SetLastToTarget | Constants.TeleportFlags.ViaLandmark));
278
281 return; 279 return;
282 } 280 }
283 else 281 else
@@ -288,6 +286,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
288 GridRegion gatekeeper = new GridRegion(); 286 GridRegion gatekeeper = new GridRegion();
289 gatekeeper.ServerURI = lm.Gatekeeper; 287 gatekeeper.ServerURI = lm.Gatekeeper;
290 GridRegion finalDestination = gConn.GetHyperlinkRegion(gatekeeper, new UUID(lm.RegionID)); 288 GridRegion finalDestination = gConn.GetHyperlinkRegion(gatekeeper, new UUID(lm.RegionID));
289
291 if (finalDestination != null) 290 if (finalDestination != null)
292 { 291 {
293 ScenePresence sp = scene.GetScenePresence(remoteClient.AgentId); 292 ScenePresence sp = scene.GetScenePresence(remoteClient.AgentId);
@@ -317,8 +316,12 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
317 IUserAgentService security = new UserAgentServiceConnector(url); 316 IUserAgentService security = new UserAgentServiceConnector(url);
318 return security.VerifyClient(aCircuit.SessionID, token); 317 return security.VerifyClient(aCircuit.SessionID, token);
319 } 318 }
320 else 319 else
321 m_log.DebugFormat("[HG ENTITY TRANSFER MODULE]: Agent {0} {1} does not have a HomeURI OH NO!", aCircuit.firstname, aCircuit.lastname); 320 {
321 m_log.DebugFormat(
322 "[HG ENTITY TRANSFER MODULE]: Agent {0} {1} does not have a HomeURI OH NO!",
323 aCircuit.firstname, aCircuit.lastname);
324 }
322 325
323 return false; 326 return false;
324 } 327 }
@@ -335,8 +338,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
335 } 338 }
336 339
337 // Let's find out if this is a foreign user or a local user 340 // Let's find out if this is a foreign user or a local user
338 IUserManagement uMan = m_aScene.RequestModuleInterface<IUserManagement>(); 341 IUserManagement uMan = m_scene.RequestModuleInterface<IUserManagement>();
339 UserAccount account = m_aScene.UserAccountService.GetUserAccount(m_aScene.RegionInfo.ScopeID, obj.AgentId); 342// UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, obj.AgentId);
340 if (uMan != null && uMan.IsLocalGridUser(obj.AgentId)) 343 if (uMan != null && uMan.IsLocalGridUser(obj.AgentId))
341 { 344 {
342 // local grid user 345 // local grid user
@@ -359,7 +362,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
359 362
360 #endregion 363 #endregion
361 364
362
363 private GridRegion MakeRegion(AgentCircuitData aCircuit) 365 private GridRegion MakeRegion(AgentCircuitData aCircuit)
364 { 366 {
365 GridRegion region = new GridRegion(); 367 GridRegion region = new GridRegion();
@@ -376,6 +378,5 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
376 region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0); 378 region.InternalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse("0.0.0.0"), (int)0);
377 return region; 379 return region;
378 } 380 }
379
380 } 381 }
381} 382} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index a71584a..cf72b58 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -364,8 +364,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
364 { 364 {
365 m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Changing root inventory for user {0}", client.Name); 365 m_log.DebugFormat("[HG INVENTORY ACCESS MODULE]: Changing root inventory for user {0}", client.Name);
366 InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID); 366 InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID);
367 List<UUID> fids = new List<UUID>(); 367
368 List<UUID> iids = new List<UUID>();
369 List<InventoryFolderBase> keep = new List<InventoryFolderBase>(); 368 List<InventoryFolderBase> keep = new List<InventoryFolderBase>();
370 369
371 foreach (InventoryFolderBase f in content.Folders) 370 foreach (InventoryFolderBase f in content.Folders)
@@ -395,4 +394,4 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
395 394
396 #endregion 395 #endregion
397 } 396 }
398} 397} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index ee9961f..31820e0 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -175,7 +175,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
175 sbyte assetType, 175 sbyte assetType,
176 byte wearableType, uint nextOwnerMask, int creationDate) 176 byte wearableType, uint nextOwnerMask, int creationDate)
177 { 177 {
178 m_log.DebugFormat("[AGENT INVENTORY]: Received request to create inventory item {0} in folder {1}", name, folderID); 178 m_log.DebugFormat("[INVENTORY ACCESS MODULE]: Received request to create inventory item {0} in folder {1}", name, folderID);
179 179
180 if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) 180 if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
181 return; 181 return;
@@ -210,7 +210,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
210 else 210 else
211 { 211 {
212 m_log.ErrorFormat( 212 m_log.ErrorFormat(
213 "ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", 213 "[INVENTORY ACCESS MODULE]: ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem",
214 remoteClient.AgentId); 214 remoteClient.AgentId);
215 } 215 }
216 } 216 }
@@ -288,16 +288,19 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
288 else 288 else
289 { 289 {
290 m_log.ErrorFormat( 290 m_log.ErrorFormat(
291 "[AGENT INVENTORY]: Could not find item {0} for caps inventory update", 291 "[INVENTORY ACCESS MODULE]: Could not find item {0} for caps inventory update",
292 itemID); 292 itemID);
293 } 293 }
294 294
295 return UUID.Zero; 295 return UUID.Zero;
296 } 296 }
297 297
298 public virtual UUID CopyToInventory(DeRezAction action, UUID folderID, 298 public virtual List<InventoryItemBase> CopyToInventory(
299 List<SceneObjectGroup> objectGroups, IClientAPI remoteClient) 299 DeRezAction action, UUID folderID,
300 List<SceneObjectGroup> objectGroups, IClientAPI remoteClient, bool asAttachment)
300 { 301 {
302 List<InventoryItemBase> copiedItems = new List<InventoryItemBase>();
303
301 Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>(); 304 Dictionary<UUID, List<SceneObjectGroup>> bundlesToCopy = new Dictionary<UUID, List<SceneObjectGroup>>();
302 305
303 if (CoalesceMultipleObjectsToInventory) 306 if (CoalesceMultipleObjectsToInventory)
@@ -324,16 +327,16 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
324 } 327 }
325 } 328 }
326 329
327 // This is method scoped and will be returned. It will be the 330// m_log.DebugFormat(
328 // last created asset id 331// "[INVENTORY ACCESS MODULE]: Copying {0} object bundles to folder {1} action {2} for {3}",
329 UUID assetID = UUID.Zero; 332// bundlesToCopy.Count, folderID, action, remoteClient.Name);
330 333
331 // Each iteration is really a separate asset being created, 334 // Each iteration is really a separate asset being created,
332 // with distinct destinations as well. 335 // with distinct destinations as well.
333 foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values) 336 foreach (List<SceneObjectGroup> bundle in bundlesToCopy.Values)
334 assetID = CopyBundleToInventory(action, folderID, bundle, remoteClient); 337 copiedItems.Add(CopyBundleToInventory(action, folderID, bundle, remoteClient, asAttachment));
335 338
336 return assetID; 339 return copiedItems;
337 } 340 }
338 341
339 /// <summary> 342 /// <summary>
@@ -344,12 +347,13 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
344 /// <param name="folderID"></param> 347 /// <param name="folderID"></param>
345 /// <param name="objlist"></param> 348 /// <param name="objlist"></param>
346 /// <param name="remoteClient"></param> 349 /// <param name="remoteClient"></param>
347 /// <returns></returns> 350 /// <param name="asAttachment">Should be true if the bundle is being copied as an attachment. This prevents
348 protected UUID CopyBundleToInventory( 351 /// attempted serialization of any script state which would abort any operating scripts.</param>
349 DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient) 352 /// <returns>The inventory item created by the copy</returns>
353 protected InventoryItemBase CopyBundleToInventory(
354 DeRezAction action, UUID folderID, List<SceneObjectGroup> objlist, IClientAPI remoteClient,
355 bool asAttachment)
350 { 356 {
351 UUID assetID = UUID.Zero;
352
353 CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero); 357 CoalescedSceneObjects coa = new CoalescedSceneObjects(UUID.Zero);
354 Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>(); 358 Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>();
355 359
@@ -401,18 +405,27 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
401 405
402 string itemXml; 406 string itemXml;
403 407
408 // If we're being called from a script, then trying to serialize that same script's state will not complete
409 // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if
410 // the client/server crashes rather than logging out normally, the attachment's scripts will resume
411 // without state on relog. Arguably, this is what we want anyway.
404 if (objlist.Count > 1) 412 if (objlist.Count > 1)
405 itemXml = CoalescedSceneObjectsSerializer.ToXml(coa); 413 itemXml = CoalescedSceneObjectsSerializer.ToXml(coa, !asAttachment);
406 else 414 else
407 itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0]); 415 itemXml = SceneObjectSerializer.ToOriginalXmlFormat(objlist[0], !asAttachment);
408 416
409 // Restore the position of each group now that it has been stored to inventory. 417 // Restore the position of each group now that it has been stored to inventory.
410 foreach (SceneObjectGroup objectGroup in objlist) 418 foreach (SceneObjectGroup objectGroup in objlist)
411 objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; 419 objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
412 420
413 InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID); 421 InventoryItemBase item = CreateItemForObject(action, remoteClient, objlist[0], folderID);
422
423// m_log.DebugFormat(
424// "[INVENTORY ACCESS MODULE]: Created item is {0}",
425// item != null ? item.ID.ToString() : "NULL");
426
414 if (item == null) 427 if (item == null)
415 return UUID.Zero; 428 return null;
416 429
417 // Can't know creator is the same, so null it in inventory 430 // Can't know creator is the same, so null it in inventory
418 if (objlist.Count > 1) 431 if (objlist.Count > 1)
@@ -422,7 +435,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
422 } 435 }
423 else 436 else
424 { 437 {
425 item.CreatorId = objlist[0].RootPart.CreatorID.ToString(); 438 item.CreatorId = objlist[0].RootPart.CreatorID.ToString();
439 item.CreatorData = objlist[0].RootPart.CreatorData;
426 item.SaleType = objlist[0].RootPart.ObjectSaleType; 440 item.SaleType = objlist[0].RootPart.ObjectSaleType;
427 item.SalePrice = objlist[0].RootPart.SalePrice; 441 item.SalePrice = objlist[0].RootPart.SalePrice;
428 } 442 }
@@ -435,8 +449,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
435 objlist[0].OwnerID.ToString()); 449 objlist[0].OwnerID.ToString());
436 m_Scene.AssetService.Store(asset); 450 m_Scene.AssetService.Store(asset);
437 451
438 item.AssetID = asset.FullID; 452 item.AssetID = asset.FullID;
439 assetID = asset.FullID;
440 453
441 if (DeRezAction.SaveToExistingUserInventoryItem == action) 454 if (DeRezAction.SaveToExistingUserInventoryItem == action)
442 { 455 {
@@ -469,9 +482,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
469 482
470 // This is a hook to do some per-asset post-processing for subclasses that need that 483 // This is a hook to do some per-asset post-processing for subclasses that need that
471 if (remoteClient != null) 484 if (remoteClient != null)
472 ExportAsset(remoteClient.AgentId, assetID); 485 ExportAsset(remoteClient.AgentId, asset.FullID);
473 486
474 return assetID; 487 return item;
475 } 488 }
476 489
477 protected virtual void ExportAsset(UUID agentID, UUID assetID) 490 protected virtual void ExportAsset(UUID agentID, UUID assetID)
@@ -617,7 +630,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
617 if (null == item) 630 if (null == item)
618 { 631 {
619 m_log.DebugFormat( 632 m_log.DebugFormat(
620 "[AGENT INVENTORY]: Object {0} {1} scheduled for save to inventory has already been deleted.", 633 "[INVENTORY ACCESS MODULE]: Object {0} {1} scheduled for save to inventory has already been deleted.",
621 so.Name, so.UUID); 634 so.Name, so.UUID);
622 635
623 return null; 636 return null;
@@ -668,7 +681,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
668 { 681 {
669 // Catch all. Use lost & found 682 // Catch all. Use lost & found
670 // 683 //
671
672 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder); 684 folder = m_Scene.InventoryService.GetFolderForType(userID, AssetType.LostAndFoundFolder);
673 } 685 }
674 } 686 }
@@ -718,7 +730,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
718 730
719 if (item == null) 731 if (item == null)
720 { 732 {
721
722 return null; 733 return null;
723 } 734 }
724 735
@@ -748,7 +759,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
748 else 759 else
749 { 760 {
750 m_log.WarnFormat( 761 m_log.WarnFormat(
751 "[InventoryAccessModule]: Could not find asset {0} for {1} in RezObject()", 762 "[INVENTORY ACCESS MODULE]: Could not find asset {0} for {1} in RezObject()",
752 assetID, remoteClient.Name); 763 assetID, remoteClient.Name);
753 } 764 }
754 765
@@ -859,7 +870,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
859 SceneObjectPart rootPart = group.RootPart; 870 SceneObjectPart rootPart = group.RootPart;
860 871
861// m_log.DebugFormat( 872// m_log.DebugFormat(
862// "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", 873// "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",
863// group.Name, group.LocalId, group.UUID, 874// group.Name, group.LocalId, group.UUID,
864// group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, 875// group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask,
865// remoteClient.Name); 876// remoteClient.Name);
@@ -867,7 +878,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
867// Vector3 storedPosition = group.AbsolutePosition; 878// Vector3 storedPosition = group.AbsolutePosition;
868 if (group.UUID == UUID.Zero) 879 if (group.UUID == UUID.Zero)
869 { 880 {
870 m_log.Debug("[InventoryAccessModule]: Object has UUID.Zero! Position 3"); 881 m_log.Debug("[INVENTORY ACCESS MODULE]: Object has UUID.Zero! Position 3");
871 } 882 }
872 883
873 foreach (SceneObjectPart part in group.Parts) 884 foreach (SceneObjectPart part in group.Parts)
@@ -928,7 +939,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
928 } 939 }
929 940
930// m_log.DebugFormat( 941// m_log.DebugFormat(
931// "[InventoryAccessModule]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", 942// "[INVENTORY ACCESS MODULE]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",
932// group.Name, group.LocalId, group.UUID, 943// group.Name, group.LocalId, group.UUID,
933// group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask, 944// group.RootPart.OwnerMask, group.RootPart.NextOwnerMask, group.RootPart.GroupMask, group.RootPart.EveryoneMask,
934// remoteClient.Name); 945// remoteClient.Name);
@@ -1023,8 +1034,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1023 1034
1024 so.FromFolderID = item.Folder; 1035 so.FromFolderID = item.Folder;
1025 1036
1026// Console.WriteLine("rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}", 1037// m_log.DebugFormat(
1027// rootPart.OwnerID, item.Owner, item.CurrentPermissions); 1038// "[INVENTORY ACCESS MODULE]: rootPart.OwnedID {0}, item.Owner {1}, item.CurrentPermissions {2:X}",
1039// rootPart.OwnerID, item.Owner, item.CurrentPermissions);
1028 1040
1029 if ((rootPart.OwnerID != item.Owner) || 1041 if ((rootPart.OwnerID != item.Owner) ||
1030 (item.CurrentPermissions & 16) != 0 || 1042 (item.CurrentPermissions & 16) != 0 ||
@@ -1160,7 +1172,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1160 if (assetRequestItem.AssetID != requestID) 1172 if (assetRequestItem.AssetID != requestID)
1161 { 1173 {
1162 m_log.WarnFormat( 1174 m_log.WarnFormat(
1163 "[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}", 1175 "[INVENTORY ACCESS MODULE]: {0} requested asset {1} from item {2} but this does not match item's asset {3}",
1164 Name, requestID, itemID, assetRequestItem.AssetID); 1176 Name, requestID, itemID, assetRequestItem.AssetID);
1165 1177
1166 return false; 1178 return false;
diff --git a/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs b/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs
new file mode 100644
index 0000000..1526886
--- /dev/null
+++ b/OpenSim/Region/CoreModules/LightShare/EnvironmentModule.cs
@@ -0,0 +1,224 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Reflection;
30using OpenMetaverse;
31using OpenSim.Framework;
32using OpenSim.Framework.Capabilities;
33using OpenSim.Framework.Servers.HttpServer;
34using OpenSim.Region.Framework.Interfaces;
35using OpenSim.Region.Framework.Scenes;
36using log4net;
37using Nini.Config;
38using Mono.Addins;
39
40using Caps = OpenSim.Framework.Capabilities.Caps;
41
42
43namespace OpenSim.Region.CoreModules.World.LightShare
44{
45 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EnvironmentModule")]
46
47 public class EnvironmentModule : INonSharedRegionModule, IEnvironmentModule
48 {
49 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
50
51 private Scene m_scene = null;
52 private UUID regionID = UUID.Zero;
53 private static bool Enabled = false;
54
55 private static readonly string capsName = "EnvironmentSettings";
56 private static readonly string capsBase = "/CAPS/0020/";
57
58 private LLSDEnvironmentSetResponse setResponse = null;
59
60 #region INonSharedRegionModule
61 public void Initialise(IConfigSource source)
62 {
63 IConfig config = source.Configs["ClientStack.LindenCaps"];
64
65 if (null == config)
66 return;
67
68 if (config.GetString("Cap_EnvironmentSettings", String.Empty) != "localhost")
69 {
70 m_log.InfoFormat("[{0}]: Module is disabled.", Name);
71 return;
72 }
73
74 Enabled = true;
75
76 m_log.InfoFormat("[{0}]: Module is enabled.", Name);
77 }
78
79 public void Close()
80 {
81 }
82
83 public string Name
84 {
85 get { return "EnvironmentModule"; }
86 }
87
88 public Type ReplaceableInterface
89 {
90 get { return null; }
91 }
92
93 public void AddRegion(Scene scene)
94 {
95 if (!Enabled)
96 return;
97
98 scene.RegisterModuleInterface<IEnvironmentModule>(this);
99 m_scene = scene;
100 regionID = scene.RegionInfo.RegionID;
101 }
102
103 public void RegionLoaded(Scene scene)
104 {
105 if (!Enabled)
106 return;
107
108 setResponse = new LLSDEnvironmentSetResponse();
109 scene.EventManager.OnRegisterCaps += OnRegisterCaps;
110 }
111
112 public void RemoveRegion(Scene scene)
113 {
114 if (Enabled)
115 return;
116
117 scene.EventManager.OnRegisterCaps -= OnRegisterCaps;
118 m_scene = null;
119 }
120 #endregion
121
122 #region IEnvironmentModule
123 public void ResetEnvironmentSettings(UUID regionUUID)
124 {
125 if (!Enabled)
126 return;
127
128 m_scene.SimulationDataService.RemoveRegionEnvironmentSettings(regionUUID);
129 }
130 #endregion
131
132 #region Events
133 private void OnRegisterCaps(UUID agentID, Caps caps)
134 {
135// m_log.DebugFormat("[{0}]: Register capability for agentID {1} in region {2}",
136// Name, agentID, caps.RegionName);
137
138 string capsPath = capsBase + UUID.Random();
139
140 // Get handler
141 caps.RegisterHandler(
142 capsName,
143 new RestStreamHandler(
144 "GET",
145 capsPath,
146 (request, path, param, httpRequest, httpResponse)
147 => GetEnvironmentSettings(request, path, param, agentID, caps),
148 capsName,
149 agentID.ToString()));
150
151 // Set handler
152 caps.HttpListener.AddStreamHandler(
153 new RestStreamHandler(
154 "POST",
155 capsPath,
156 (request, path, param, httpRequest, httpResponse)
157 => SetEnvironmentSettings(request, path, param, agentID, caps),
158 capsName,
159 agentID.ToString()));
160 }
161 #endregion
162
163 private string GetEnvironmentSettings(string request, string path, string param,
164 UUID agentID, Caps caps)
165 {
166// m_log.DebugFormat("[{0}]: Environment GET handle for agentID {1} in region {2}",
167// Name, agentID, caps.RegionName);
168
169 string env = String.Empty;
170
171 try
172 {
173 env = m_scene.SimulationDataService.LoadRegionEnvironmentSettings(regionID);
174 }
175 catch (Exception e)
176 {
177 m_log.ErrorFormat("[{0}]: Unable to load environment settings for region {1}, Exception: {2} - {3}",
178 Name, caps.RegionName, e.Message, e.StackTrace);
179 }
180
181 if (String.IsNullOrEmpty(env))
182 env = EnvironmentSettings.EmptySettings(UUID.Zero, regionID);
183
184 return env;
185 }
186
187 private string SetEnvironmentSettings(string request, string path, string param,
188 UUID agentID, Caps caps)
189 {
190
191// m_log.DebugFormat("[{0}]: Environment SET handle from agentID {1} in region {2}",
192// Name, agentID, caps.RegionName);
193
194 setResponse.regionID = regionID;
195 setResponse.success = false;
196
197 if (!m_scene.Permissions.CanIssueEstateCommand(agentID, false))
198 {
199 setResponse.fail_reason = "Insufficient estate permissions, settings has not been saved.";
200 return LLSDHelpers.SerialiseLLSDReply(setResponse);
201 }
202
203 try
204 {
205 m_scene.SimulationDataService.StoreRegionEnvironmentSettings(regionID, request);
206 setResponse.success = true;
207
208 m_log.InfoFormat("[{0}]: New Environment settings has been saved from agentID {1} in region {2}",
209 Name, agentID, caps.RegionName);
210 }
211 catch (Exception e)
212 {
213 m_log.ErrorFormat("[{0}]: Environment settings has not been saved for region {1}, Exception: {2} - {3}",
214 Name, caps.RegionName, e.Message, e.StackTrace);
215
216 setResponse.success = false;
217 setResponse.fail_reason = String.Format("Environment Set for region {0} has failed, settings has not been saved.", caps.RegionName);
218 }
219
220 return LLSDHelpers.SerialiseLLSDReply(setResponse);
221 }
222 }
223}
224
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 199dd11..1865ab8 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -85,6 +85,10 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
85 private IHttpServer m_HttpsServer = null; 85 private IHttpServer m_HttpsServer = null;
86 86
87 private string m_ExternalHostNameForLSL = ""; 87 private string m_ExternalHostNameForLSL = "";
88 public string ExternalHostNameForLSL
89 {
90 get { return m_ExternalHostNameForLSL; }
91 }
88 92
89 public Type ReplaceableInterface 93 public Type ReplaceableInterface
90 { 94 {
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs
index 8df1c7b..a7dd0dd 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Hypergrid/HypergridServiceInConnectorModule.cs
@@ -122,7 +122,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Hypergrid
122 ISimulationService simService = scene.RequestModuleInterface<ISimulationService>(); 122 ISimulationService simService = scene.RequestModuleInterface<ISimulationService>();
123 IFriendsSimConnector friendsConn = scene.RequestModuleInterface<IFriendsSimConnector>(); 123 IFriendsSimConnector friendsConn = scene.RequestModuleInterface<IFriendsSimConnector>();
124 Object[] args = new Object[] { m_Config }; 124 Object[] args = new Object[] { m_Config };
125 IFriendsService friendsService = ServerUtils.LoadPlugin<IFriendsService>(m_LocalServiceDll, args); 125// IFriendsService friendsService = ServerUtils.LoadPlugin<IFriendsService>(m_LocalServiceDll, args)
126 ServerUtils.LoadPlugin<IFriendsService>(m_LocalServiceDll, args);
126 127
127 m_HypergridHandler = new GatekeeperServiceInConnector(m_Config, MainServer.Instance, simService); 128 m_HypergridHandler = new GatekeeperServiceInConnector(m_Config, MainServer.Instance, simService);
128 129
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
index 8395f83..008465f 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs
@@ -149,7 +149,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset
149 149
150 m_aScene = scene; 150 m_aScene = scene;
151 151
152 scene.RegisterModuleInterface<IAssetService>(this); 152 m_aScene.RegisterModuleInterface<IAssetService>(this);
153 } 153 }
154 154
155 public void RemoveRegion(Scene scene) 155 public void RemoveRegion(Scene scene)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index de089f3..008992e 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27using System; 27using System;
28using System.Collections.Generic; 28using System.Collections.Generic;
29using System.Linq;
29using System.Reflection; 30using System.Reflection;
30using log4net; 31using log4net;
31using Nini.Config; 32using Nini.Config;
@@ -41,22 +42,20 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
41 public class LocalSimulationConnectorModule : ISharedRegionModule, ISimulationService 42 public class LocalSimulationConnectorModule : ISharedRegionModule, ISimulationService
42 { 43 {
43 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 44 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44 // Version of this service
45 private const string m_Version = "SIMULATION/0.1";
46 45
47 private List<Scene> m_sceneList = new List<Scene>(); 46 /// <summary>
47 /// Version of this service
48 /// </summary>
49 private const string m_Version = "SIMULATION/0.1";
48 50
49 private IEntityTransferModule m_AgentTransferModule; 51 /// <summary>
50 protected IEntityTransferModule AgentTransferModule 52 /// Map region ID to scene.
51 { 53 /// </summary>
52 get 54 private Dictionary<UUID, Scene> m_scenes = new Dictionary<UUID, Scene>();
53 {
54 if (m_AgentTransferModule == null)
55 m_AgentTransferModule = m_sceneList[0].RequestModuleInterface<IEntityTransferModule>();
56 return m_AgentTransferModule;
57 }
58 }
59 55
56 /// <summary>
57 /// Is this module enabled?
58 /// </summary>
60 private bool m_ModuleEnabled = false; 59 private bool m_ModuleEnabled = false;
61 60
62 #region IRegionModule 61 #region IRegionModule
@@ -129,12 +128,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
129 /// <param name="scene"></param> 128 /// <param name="scene"></param>
130 public void RemoveScene(Scene scene) 129 public void RemoveScene(Scene scene)
131 { 130 {
132 lock (m_sceneList) 131 lock (m_scenes)
133 { 132 {
134 if (m_sceneList.Contains(scene)) 133 if (m_scenes.ContainsKey(scene.RegionInfo.RegionID))
135 { 134 m_scenes.Remove(scene.RegionInfo.RegionID);
136 m_sceneList.Remove(scene); 135 else
137 } 136 m_log.WarnFormat(
137 "[LOCAL SIMULATION CONNECTOR]: Tried to remove region {0} but it was not present",
138 scene.RegionInfo.RegionName);
138 } 139 }
139 } 140 }
140 141
@@ -144,13 +145,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
144 /// <param name="scene"></param> 145 /// <param name="scene"></param>
145 public void Init(Scene scene) 146 public void Init(Scene scene)
146 { 147 {
147 if (!m_sceneList.Contains(scene)) 148 lock (m_scenes)
148 { 149 {
149 lock (m_sceneList) 150 if (!m_scenes.ContainsKey(scene.RegionInfo.RegionID))
150 { 151 m_scenes[scene.RegionInfo.RegionID] = scene;
151 m_sceneList.Add(scene); 152 else
152 } 153 m_log.WarnFormat(
153 154 "[LOCAL SIMULATION CONNECTOR]: Tried to add region {0} but it is already present",
155 scene.RegionInfo.RegionName);
154 } 156 }
155 } 157 }
156 158
@@ -158,15 +160,24 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
158 160
159 #region ISimulation 161 #region ISimulation
160 162
161 public IScene GetScene(ulong regionhandle) 163 public IScene GetScene(UUID regionId)
162 { 164 {
163 foreach (Scene s in m_sceneList) 165 if (m_scenes.ContainsKey(regionId))
164 { 166 {
165 if (s.RegionInfo.RegionHandle == regionhandle) 167 return m_scenes[regionId];
166 return s; 168 }
169 else
170 {
171 // FIXME: This was pre-existing behaviour but possibly not a good idea, since it hides an error rather
172 // than making it obvious and fixable. Need to see if the error message comes up in practice.
173 Scene s = m_scenes.Values.ToArray()[0];
174
175 m_log.ErrorFormat(
176 "[LOCAL SIMULATION CONNECTOR]: Region with id {0} not found. Returning {1} {2} instead",
177 regionId, s.RegionInfo.RegionName, s.RegionInfo.RegionID);
178
179 return s;
167 } 180 }
168 // ? weird. should not happen
169 return m_sceneList[0];
170 } 181 }
171 182
172 public ISimulationService GetInnerService() 183 public ISimulationService GetInnerService()
@@ -187,13 +198,10 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
187 return false; 198 return false;
188 } 199 }
189 200
190 foreach (Scene s in m_sceneList) 201 if (m_scenes.ContainsKey(destination.RegionID))
191 { 202 {
192 if (s.RegionInfo.RegionHandle == destination.RegionHandle)
193 {
194// m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Found region {0} to send SendCreateChildAgent", destination.RegionName); 203// m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Found region {0} to send SendCreateChildAgent", destination.RegionName);
195 return s.NewUserConnection(aCircuit, teleportFlags, out reason); 204 return m_scenes[destination.RegionID].NewUserConnection(aCircuit, teleportFlags, out reason);
196 }
197 } 205 }
198 206
199 reason = "Did not find region " + destination.RegionName; 207 reason = "Did not find region " + destination.RegionName;
@@ -205,17 +213,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
205 if (destination == null) 213 if (destination == null)
206 return false; 214 return false;
207 215
208 foreach (Scene s in m_sceneList) 216 if (m_scenes.ContainsKey(destination.RegionID))
209 { 217 {
210 if (s.RegionInfo.RegionHandle == destination.RegionHandle)
211 {
212// m_log.DebugFormat( 218// m_log.DebugFormat(
213// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate", 219// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
214// s.RegionInfo.RegionName, destination.RegionHandle); 220// s.RegionInfo.RegionName, destination.RegionHandle);
215 221
216 s.IncomingChildAgentDataUpdate(cAgentData); 222 return m_scenes[destination.RegionID].IncomingChildAgentDataUpdate(cAgentData);
217 return true;
218 }
219 } 223 }
220 224
221// m_log.DebugFormat("[LOCAL COMMS]: Did not find region {0} for ChildAgentUpdate", regionHandle); 225// m_log.DebugFormat("[LOCAL COMMS]: Did not find region {0} for ChildAgentUpdate", regionHandle);
@@ -231,11 +235,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
231 // simulator so when we receive the update we need to hand it to each of the 235 // simulator so when we receive the update we need to hand it to each of the
232 // scenes; scenes each check to see if the is a scene presence for the avatar 236 // scenes; scenes each check to see if the is a scene presence for the avatar
233 // note that we really don't need the GridRegion for this call 237 // note that we really don't need the GridRegion for this call
234 foreach (Scene s in m_sceneList) 238 foreach (Scene s in m_scenes.Values)
235 { 239 {
236 //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); 240 //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate");
237 s.IncomingChildAgentDataUpdate(cAgentData); 241 s.IncomingChildAgentDataUpdate(cAgentData);
238 } 242 }
243
239 //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); 244 //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate");
240 return true; 245 return true;
241 } 246 }
@@ -247,14 +252,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
247 if (destination == null) 252 if (destination == null)
248 return false; 253 return false;
249 254
250 foreach (Scene s in m_sceneList) 255 if (m_scenes.ContainsKey(destination.RegionID))
251 { 256 {
252 if (s.RegionInfo.RegionHandle == destination.RegionHandle) 257// m_log.DebugFormat(
253 { 258// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
254 //m_log.Debug("[LOCAL COMMS]: Found region to send ChildAgentUpdate"); 259// s.RegionInfo.RegionName, destination.RegionHandle);
255 return s.IncomingRetrieveRootAgent(id, out agent); 260
256 } 261 return m_scenes[destination.RegionID].IncomingRetrieveRootAgent(id, out agent);
257 } 262 }
263
258 //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate"); 264 //m_log.Debug("[LOCAL COMMS]: region not found for ChildAgentUpdate");
259 return false; 265 return false;
260 } 266 }
@@ -266,59 +272,49 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
266 if (destination == null) 272 if (destination == null)
267 return false; 273 return false;
268 274
269 foreach (Scene s in m_sceneList) 275 if (m_scenes.ContainsKey(destination.RegionID))
270 { 276 {
271 if (s.RegionInfo.RegionID == destination.RegionID) 277// m_log.DebugFormat(
272 return s.QueryAccess(id, position, out reason); 278// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
279// s.RegionInfo.RegionName, destination.RegionHandle);
280
281 return m_scenes[destination.RegionID].QueryAccess(id, position, out reason);
273 } 282 }
283
284 //m_log.Debug("[LOCAL COMMS]: region not found for QueryAccess");
274 return false; 285 return false;
275 } 286 }
276 287
277 public bool ReleaseAgent(UUID origin, UUID id, string uri) 288 public bool ReleaseAgent(UUID originId, UUID agentId, string uri)
278 { 289 {
279 foreach (Scene s in m_sceneList) 290 if (m_scenes.ContainsKey(originId))
280 { 291 {
281 if (s.RegionInfo.RegionID == origin) 292// m_log.DebugFormat(
282 { 293// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
283// m_log.Debug("[LOCAL COMMS]: Found region to SendReleaseAgent"); 294// s.RegionInfo.RegionName, destination.RegionHandle);
284 AgentTransferModule.AgentArrivedAtDestination(id); 295
285 return true; 296 m_scenes[originId].EntityTransferModule.AgentArrivedAtDestination(agentId);
286// return s.IncomingReleaseAgent(id); 297 return true;
287 }
288 } 298 }
299
289 //m_log.Debug("[LOCAL COMMS]: region not found in SendReleaseAgent " + origin); 300 //m_log.Debug("[LOCAL COMMS]: region not found in SendReleaseAgent " + origin);
290 return false; 301 return false;
291 } 302 }
292 303
293 public bool CloseAgent(GridRegion destination, UUID id) 304 public bool CloseChildAgent(GridRegion destination, UUID id)
294 { 305 {
295 if (destination == null) 306 return CloseAgent(destination, id);
296 return false;
297
298 foreach (Scene s in m_sceneList)
299 {
300 if (s.RegionInfo.RegionID == destination.RegionID)
301 {
302 //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent");
303 return s.IncomingCloseAgent(id);
304 }
305 }
306 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent");
307 return false;
308 } 307 }
309 308
310 public bool CloseChildAgent(GridRegion destination, UUID id) 309 public bool CloseAgent(GridRegion destination, UUID id)
311 { 310 {
312 if (destination == null) 311 if (destination == null)
313 return false; 312 return false;
314 313
315 foreach (Scene s in m_sceneList) 314 if (m_scenes.ContainsKey(destination.RegionID))
316 { 315 {
317 if (s.RegionInfo.RegionID == destination.RegionID) 316 Util.FireAndForget(delegate { m_scenes[destination.RegionID].IncomingCloseAgent(id); });
318 { 317 return true;
319 //m_log.Debug("[LOCAL COMMS]: Found region to SendCloseAgent");
320 return s.IncomingCloseChildAgent(id);
321 }
322 } 318 }
323 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent"); 319 //m_log.Debug("[LOCAL COMMS]: region not found in SendCloseAgent");
324 return false; 320 return false;
@@ -333,25 +329,28 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
333 if (destination == null) 329 if (destination == null)
334 return false; 330 return false;
335 331
336 foreach (Scene s in m_sceneList) 332 if (m_scenes.ContainsKey(destination.RegionID))
337 { 333 {
338 if (s.RegionInfo.RegionHandle == destination.RegionHandle) 334// m_log.DebugFormat(
335// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
336// s.RegionInfo.RegionName, destination.RegionHandle);
337
338 Scene s = m_scenes[destination.RegionID];
339
340 if (isLocalCall)
339 { 341 {
340 //m_log.Debug("[LOCAL COMMS]: Found region to SendCreateObject"); 342 // We need to make a local copy of the object
341 if (isLocalCall) 343 ISceneObject sogClone = sog.CloneForNewScene();
342 { 344 sogClone.SetState(sog.GetStateSnapshot(), s);
343 // We need to make a local copy of the object 345 return s.IncomingCreateObject(newPosition, sogClone);
344 ISceneObject sogClone = sog.CloneForNewScene(); 346 }
345 sogClone.SetState(sog.GetStateSnapshot(), s); 347 else
346 return s.IncomingCreateObject(newPosition, sogClone); 348 {
347 } 349 // Use the object as it came through the wire
348 else 350 return s.IncomingCreateObject(newPosition, sog);
349 {
350 // Use the object as it came through the wire
351 return s.IncomingCreateObject(newPosition, sog);
352 }
353 } 351 }
354 } 352 }
353
355 return false; 354 return false;
356 } 355 }
357 356
@@ -360,13 +359,15 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
360 if (destination == null) 359 if (destination == null)
361 return false; 360 return false;
362 361
363 foreach (Scene s in m_sceneList) 362 if (m_scenes.ContainsKey(destination.RegionID))
364 { 363 {
365 if (s.RegionInfo.RegionHandle == destination.RegionHandle) 364// m_log.DebugFormat(
366 { 365// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
367 return s.IncomingCreateObject(userID, itemID); 366// s.RegionInfo.RegionName, destination.RegionHandle);
368 } 367
368 return m_scenes[destination.RegionID].IncomingCreateObject(userID, itemID);
369 } 369 }
370
370 return false; 371 return false;
371 } 372 }
372 373
@@ -377,18 +378,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
377 378
378 public bool IsLocalRegion(ulong regionhandle) 379 public bool IsLocalRegion(ulong regionhandle)
379 { 380 {
380 foreach (Scene s in m_sceneList) 381 foreach (Scene s in m_scenes.Values)
381 if (s.RegionInfo.RegionHandle == regionhandle) 382 if (s.RegionInfo.RegionHandle == regionhandle)
382 return true; 383 return true;
384
383 return false; 385 return false;
384 } 386 }
385 387
386 public bool IsLocalRegion(UUID id) 388 public bool IsLocalRegion(UUID id)
387 { 389 {
388 foreach (Scene s in m_sceneList) 390 return m_scenes.ContainsKey(id);
389 if (s.RegionInfo.RegionID == id)
390 return true;
391 return false;
392 } 391 }
393 392
394 #endregion 393 #endregion
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
index 4b70692..d395413 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
@@ -151,9 +151,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
151 151
152 #region IInterregionComms 152 #region IInterregionComms
153 153
154 public IScene GetScene(ulong handle) 154 public IScene GetScene(UUID regionId)
155 { 155 {
156 return m_localBackend.GetScene(handle); 156 return m_localBackend.GetScene(regionId);
157 } 157 }
158 158
159 public ISimulationService GetInnerService() 159 public ISimulationService GetInnerService()
@@ -226,13 +226,13 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
226 return m_remoteConnector.RetrieveAgent(destination, id, out agent); 226 return m_remoteConnector.RetrieveAgent(destination, id, out agent);
227 227
228 return false; 228 return false;
229
230 } 229 }
231 230
232 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason) 231 public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string version, out string reason)
233 { 232 {
234 reason = "Communications failure"; 233 reason = "Communications failure";
235 version = "Unknown"; 234 version = "Unknown";
235
236 if (destination == null) 236 if (destination == null)
237 return false; 237 return false;
238 238
@@ -245,7 +245,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
245 return m_remoteConnector.QueryAccess(destination, id, position, out version, out reason); 245 return m_remoteConnector.QueryAccess(destination, id, position, out version, out reason);
246 246
247 return false; 247 return false;
248
249 } 248 }
250 249
251 public bool ReleaseAgent(UUID origin, UUID id, string uri) 250 public bool ReleaseAgent(UUID origin, UUID id, string uri)
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
index 504f09b..4edaaca 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveWriteRequestPreparation.cs
@@ -428,9 +428,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver
428 s = sw.ToString(); 428 s = sw.ToString();
429 } 429 }
430 430
431 if (m_scene != null) 431// if (m_scene != null)
432 Console.WriteLine( 432// Console.WriteLine(
433 "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s); 433// "[ARCHIVE WRITE REQUEST PREPARATION]: Control file for {0} is: {1}", m_scene.RegionInfo.RegionName, s);
434 434
435 return s; 435 return s;
436 } 436 }
diff --git a/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs
new file mode 100644
index 0000000..2838e0c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/World/Region/RegionCommandsModule.cs
@@ -0,0 +1,155 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Reflection;
31using System.Text;
32using System.Text.RegularExpressions;
33using log4net;
34using Mono.Addins;
35using NDesk.Options;
36using Nini.Config;
37using OpenMetaverse;
38using OpenSim.Framework;
39using OpenSim.Framework.Console;
40using OpenSim.Framework.Statistics;
41using OpenSim.Region.Framework.Interfaces;
42using OpenSim.Region.Framework.Scenes;
43
44namespace OpenSim.Region.CoreModules.World.Objects.Commands
45{
46 /// <summary>
47 /// A module that holds commands for manipulating objects in the scene.
48 /// </summary>
49 [Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RegionCommandsModule")]
50 public class RegionCommandsModule : INonSharedRegionModule
51 {
52 private Scene m_scene;
53 private ICommandConsole m_console;
54
55 public string Name { get { return "Region Commands Module"; } }
56
57 public Type ReplaceableInterface { get { return null; } }
58
59 public void Initialise(IConfigSource source)
60 {
61// m_log.DebugFormat("[REGION COMMANDS MODULE]: INITIALIZED MODULE");
62 }
63
64 public void PostInitialise()
65 {
66// m_log.DebugFormat("[REGION COMMANDS MODULE]: POST INITIALIZED MODULE");
67 }
68
69 public void Close()
70 {
71// m_log.DebugFormat("[REGION COMMANDS MODULE]: CLOSED MODULE");
72 }
73
74 public void AddRegion(Scene scene)
75 {
76// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} ADDED", scene.RegionInfo.RegionName);
77
78 m_scene = scene;
79 m_console = MainConsole.Instance;
80
81 m_console.Commands.AddCommand(
82 "Regions", false, "show scene",
83 "show scene",
84 "Show live scene information for the currently selected region.", HandleShowScene);
85 }
86
87 public void RemoveRegion(Scene scene)
88 {
89// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} REMOVED", scene.RegionInfo.RegionName);
90 }
91
92 public void RegionLoaded(Scene scene)
93 {
94// m_log.DebugFormat("[REGION COMMANDS MODULE]: REGION {0} LOADED", scene.RegionInfo.RegionName);
95 }
96
97 private void HandleShowScene(string module, string[] cmd)
98 {
99 if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_scene))
100 return;
101
102 SimStatsReporter r = m_scene.StatsReporter;
103 float[] stats = r.LastReportedSimStats;
104
105 float timeDilation = stats[0];
106 float simFps = stats[1];
107 float physicsFps = stats[2];
108 float agentUpdates = stats[3];
109 float rootAgents = stats[4];
110 float childAgents = stats[5];
111 float totalPrims = stats[6];
112 float activePrims = stats[7];
113 float totalFrameTime = stats[8];
114// float netFrameTime = stats.StatsBlock[9].StatValue; // Ignored - not used by OpenSimulator
115 float physicsFrameTime = stats[10];
116 float otherFrameTime = stats[11];
117// float imageFrameTime = stats.StatsBlock[12].StatValue; // Ignored
118 float inPacketsPerSecond = stats[13];
119 float outPacketsPerSecond = stats[14];
120 float unackedBytes = stats[15];
121// float agentFrameTime = stats.StatsBlock[16].StatValue; // Not really used
122 float pendingDownloads = stats[17];
123 float pendingUploads = stats[18];
124 float activeScripts = stats[19];
125 float scriptLinesPerSecond = stats[20];
126
127 StringBuilder sb = new StringBuilder();
128 sb.AppendFormat("Scene statistics for {0}\n", m_scene.RegionInfo.RegionName);
129
130 ConsoleDisplayList dispList = new ConsoleDisplayList();
131 dispList.AddRow("Time Dilation", timeDilation);
132 dispList.AddRow("Sim FPS", simFps);
133 dispList.AddRow("Physics FPS", physicsFps);
134 dispList.AddRow("Avatars", rootAgents);
135 dispList.AddRow("Child agents", childAgents);
136 dispList.AddRow("Total prims", totalPrims);
137 dispList.AddRow("Scripts", activeScripts);
138 dispList.AddRow("Script lines processed per second", scriptLinesPerSecond);
139 dispList.AddRow("Physics enabled prims", activePrims);
140 dispList.AddRow("Total frame time", totalFrameTime);
141 dispList.AddRow("Physics frame time", physicsFrameTime);
142 dispList.AddRow("Other frame time", otherFrameTime);
143 dispList.AddRow("Agent Updates per second", agentUpdates);
144 dispList.AddRow("Packets processed from clients per second", inPacketsPerSecond);
145 dispList.AddRow("Packets sent to clients per second", outPacketsPerSecond);
146 dispList.AddRow("Bytes unacknowledged by clients", unackedBytes);
147 dispList.AddRow("Pending asset downloads to clients", pendingDownloads);
148 dispList.AddRow("Pending asset uploads from clients", pendingUploads);
149
150 dispList.AddToStringBuilder(sb);
151
152 MainConsole.Instance.Output(sb.ToString());
153 }
154 }
155} \ No newline at end of file
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs
index 5d2f893..b416b82 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs
@@ -59,7 +59,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
59 } 59 }
60 60
61 //Returns true if this extension is supported for terrain save-tile 61 //Returns true if this extension is supported for terrain save-tile
62 public bool SupportsTileSave() 62 public override bool SupportsTileSave()
63 { 63 {
64 return false; 64 return false;
65 } 65 }
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs
index 1ebf916..71c71e6 100644
--- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs
+++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/Terragen.cs
@@ -65,7 +65,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
65 bool eof = false; 65 bool eof = false;
66 66
67 int fileXPoints = 0; 67 int fileXPoints = 0;
68 int fileYPoints = 0; 68// int fileYPoints = 0;
69 69
70 // Terragen file 70 // Terragen file
71 while (eof == false) 71 while (eof == false)
@@ -75,7 +75,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
75 { 75 {
76 case "SIZE": 76 case "SIZE":
77 fileXPoints = bs.ReadInt16() + 1; 77 fileXPoints = bs.ReadInt16() + 1;
78 fileYPoints = fileXPoints; 78// fileYPoints = fileXPoints;
79 bs.ReadInt16(); 79 bs.ReadInt16();
80 break; 80 break;
81 case "XPTS": 81 case "XPTS":
@@ -83,7 +83,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
83 bs.ReadInt16(); 83 bs.ReadInt16();
84 break; 84 break;
85 case "YPTS": 85 case "YPTS":
86 fileYPoints = bs.ReadInt16(); 86// fileYPoints = bs.ReadInt16();
87 bs.ReadInt16();
87 bs.ReadInt16(); 88 bs.ReadInt16();
88 break; 89 break;
89 case "ALTW": 90 case "ALTW":
@@ -164,10 +165,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
164 bool eof = false; 165 bool eof = false;
165 if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ") 166 if (Encoding.ASCII.GetString(bs.ReadBytes(16)) == "TERRAGENTERRAIN ")
166 { 167 {
167 168// int fileWidth = w;
168 int fileWidth = w; 169// int fileHeight = h;
169 int fileHeight = h;
170
171 170
172 // Terragen file 171 // Terragen file
173 while (eof == false) 172 while (eof == false)
@@ -176,17 +175,22 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders
176 switch (tmp) 175 switch (tmp)
177 { 176 {
178 case "SIZE": 177 case "SIZE":
179 int sztmp = bs.ReadInt16() + 1; 178// int sztmp = bs.ReadInt16() + 1;
180 fileWidth = sztmp; 179// fileWidth = sztmp;
181 fileHeight = sztmp; 180// fileHeight = sztmp;
181 bs.ReadInt16();
182 bs.ReadInt16();
183 bs.ReadInt16();
182 bs.ReadInt16(); 184 bs.ReadInt16();
183 break; 185 break;
184 case "XPTS": 186 case "XPTS":
185 fileWidth = bs.ReadInt16(); 187// fileWidth = bs.ReadInt16();
188 bs.ReadInt16();
186 bs.ReadInt16(); 189 bs.ReadInt16();
187 break; 190 break;
188 case "YPTS": 191 case "YPTS":
189 fileHeight = bs.ReadInt16(); 192// fileHeight = bs.ReadInt16();
193 bs.ReadInt16();
190 bs.ReadInt16(); 194 bs.ReadInt16();
191 break; 195 break;
192 case "ALTW": 196 case "ALTW":
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 8732ec0..c605fc1 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -166,6 +166,19 @@ namespace OpenSim.Region.Framework.Interfaces
166 List<TaskInventoryItem> GetInventoryItems(); 166 List<TaskInventoryItem> GetInventoryItems();
167 167
168 /// <summary> 168 /// <summary>
169 /// Gets an inventory item by name
170 /// </summary>
171 /// <remarks>
172 /// This method returns the first inventory item that matches the given name. In SL this is all you need
173 /// since each item in a prim inventory must have a unique name.
174 /// </remarks>
175 /// <param name='name'></param>
176 /// <returns>
177 /// The inventory item. Null if no such item was found.
178 /// </returns>
179 TaskInventoryItem GetInventoryItem(string name);
180
181 /// <summary>
169 /// Get inventory items by name. 182 /// Get inventory items by name.
170 /// </summary> 183 /// </summary>
171 /// <param name="name"></param> 184 /// <param name="name"></param>
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
index 9cd27f9..5bc8e51 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityTransferModule.cs
@@ -57,6 +57,13 @@ namespace OpenSim.Region.Framework.Interfaces
57 void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination, 57 void DoTeleport(ScenePresence sp, GridRegion reg, GridRegion finalDestination,
58 Vector3 position, Vector3 lookAt, uint teleportFlags); 58 Vector3 position, Vector3 lookAt, uint teleportFlags);
59 59
60 /// <summary>
61 /// Show whether the given agent is being teleported.
62 /// </summary>
63 /// <param name='id'>The agent ID</para></param>
64 /// <returns>true if the agent is in the process of being teleported, false otherwise.</returns>
65 bool IsInTransit(UUID id);
66
60 bool Cross(ScenePresence agent, bool isFlying); 67 bool Cross(ScenePresence agent, bool isFlying);
61 68
62 void AgentArrivedAtDestination(UUID agent); 69 void AgentArrivedAtDestination(UUID agent);
diff --git a/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs b/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs
new file mode 100644
index 0000000..7a7b782
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IEnvironmentModule.cs
@@ -0,0 +1,36 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using OpenMetaverse;
29
30namespace OpenSim.Region.Framework.Interfaces
31{
32 public interface IEnvironmentModule
33 {
34 void ResetEnvironmentSettings(UUID regionUUID);
35 }
36}
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
index 1904011..3576e35 100644
--- a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
@@ -49,11 +49,15 @@ namespace OpenSim.Region.Framework.Interfaces
49 /// <param name="folderID"></param> 49 /// <param name="folderID"></param>
50 /// <param name="objectGroups"></param> 50 /// <param name="objectGroups"></param>
51 /// <param name="remoteClient"></param> 51 /// <param name="remoteClient"></param>
52 /// <param name="asAttachment">
53 /// Should be true if the object(s) are begin taken as attachments. False otherwise.
54 /// </param>
52 /// <returns> 55 /// <returns>
53 /// Returns the UUID of the newly created item asset (not the item itself). 56 /// A list of the items created. If there was more than one object and objects are not being coaleseced in
54 /// FIXME: This is not very useful. It would be far more useful to return a list of items instead. 57 /// inventory, then the order of items is in the same order as the input objects.
55 /// </returns> 58 /// </returns>
56 UUID CopyToInventory(DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient); 59 List<InventoryItemBase> CopyToInventory(
60 DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient, bool asAttachment);
57 61
58 /// <summary> 62 /// <summary>
59 /// Rez an object into the scene from the user's inventory 63 /// Rez an object into the scene from the user's inventory
diff --git a/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs
index 5295a72..0fcafcc 100644
--- a/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs
+++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataService.cs
@@ -95,5 +95,26 @@ namespace OpenSim.Region.Framework.Interfaces
95 RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID); 95 RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID);
96 void StoreRegionWindlightSettings(RegionLightShareData wl); 96 void StoreRegionWindlightSettings(RegionLightShareData wl);
97 void RemoveRegionWindlightSettings(UUID regionID); 97 void RemoveRegionWindlightSettings(UUID regionID);
98
99 /// <summary>
100 /// Load Environment settings from region storage
101 /// </summary>
102 /// <param name="regionUUID">the region UUID</param>
103 /// <returns>LLSD string for viewer</returns>
104 string LoadRegionEnvironmentSettings(UUID regionUUID);
105
106 /// <summary>
107 /// Store Environment settings into region storage
108 /// </summary>
109 /// <param name="regionUUID">the region UUID</param>
110 /// <param name="settings">LLSD string from viewer</param>
111 void StoreRegionEnvironmentSettings(UUID regionUUID, string settings);
112
113 /// <summary>
114 /// Delete Environment settings from region storage
115 /// </summary>
116 /// <param name="regionUUID">the region UUID</param>
117 void RemoveRegionEnvironmentSettings(UUID regionUUID);
118
98 } 119 }
99} 120}
diff --git a/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs
index 615f377..e424976 100644
--- a/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs
+++ b/OpenSim/Region/Framework/Interfaces/ISimulationDataStore.cs
@@ -107,6 +107,26 @@ namespace OpenSim.Region.Framework.Interfaces
107 void StoreRegionWindlightSettings(RegionLightShareData wl); 107 void StoreRegionWindlightSettings(RegionLightShareData wl);
108 void RemoveRegionWindlightSettings(UUID regionID); 108 void RemoveRegionWindlightSettings(UUID regionID);
109 109
110 /// <summary>
111 /// Load Environment settings from region storage
112 /// </summary>
113 /// <param name="regionUUID">the region UUID</param>
114 /// <returns>LLSD string for viewer</returns>
115 string LoadRegionEnvironmentSettings(UUID regionUUID);
116
117 /// <summary>
118 /// Store Environment settings into region storage
119 /// </summary>
120 /// <param name="regionUUID">the region UUID</param>
121 /// <param name="settings">LLSD string from viewer</param>
122 void StoreRegionEnvironmentSettings(UUID regionUUID, string settings);
123
124 /// <summary>
125 /// Delete Environment settings from region storage
126 /// </summary>
127 /// <param name="regionUUID">the region UUID</param>
128 void RemoveRegionEnvironmentSettings(UUID regionUUID);
129
110 void Shutdown(); 130 void Shutdown();
111 } 131 }
112} 132}
diff --git a/OpenSim/Region/Framework/Interfaces/IUrlModule.cs b/OpenSim/Region/Framework/Interfaces/IUrlModule.cs
index 1b91166..457444c 100644
--- a/OpenSim/Region/Framework/Interfaces/IUrlModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IUrlModule.cs
@@ -34,6 +34,7 @@ namespace OpenSim.Region.Framework.Interfaces
34{ 34{
35 public interface IUrlModule 35 public interface IUrlModule
36 { 36 {
37 string ExternalHostNameForLSL { get; }
37 UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID); 38 UUID RequestURL(IScriptModule engine, SceneObjectPart host, UUID itemID);
38 UUID RequestSecureURL(IScriptModule engine, SceneObjectPart host, UUID itemID); 39 UUID RequestSecureURL(IScriptModule engine, SceneObjectPart host, UUID itemID);
39 void ReleaseURL(string url); 40 void ReleaseURL(string url);
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
index 834464b..f555b49 100644
--- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -155,7 +155,7 @@ namespace OpenSim.Region.Framework.Scenes
155 { 155 {
156 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 156 IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
157 if (invAccess != null) 157 if (invAccess != null)
158 invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient); 158 invAccess.CopyToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient, false);
159 159
160 if (x.permissionToDelete) 160 if (x.permissionToDelete)
161 { 161 {
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 942c625..270b01b 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -954,8 +954,8 @@ namespace OpenSim.Region.Framework.Scenes
954 sbyte invType, sbyte type, UUID olditemID) 954 sbyte invType, sbyte type, UUID olditemID)
955 { 955 {
956// m_log.DebugFormat( 956// m_log.DebugFormat(
957// "[AGENT INVENTORY]: Received request from {0} to create inventory item link {1} in folder {2} pointing to {3}", 957// "[AGENT INVENTORY]: Received request from {0} to create inventory item link {1} in folder {2} pointing to {3}, assetType {4}, inventoryType {5}",
958// remoteClient.Name, name, folderID, olditemID); 958// remoteClient.Name, name, folderID, olditemID, (AssetType)type, (InventoryType)invType);
959 959
960 if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) 960 if (!Permissions.CanCreateUserInventory(invType, remoteClient.AgentId))
961 return; 961 return;
@@ -988,10 +988,10 @@ namespace OpenSim.Region.Framework.Scenes
988 asset.Type = type; 988 asset.Type = type;
989 asset.Name = name; 989 asset.Name = name;
990 asset.Description = description; 990 asset.Description = description;
991 991
992 CreateNewInventoryItem( 992 CreateNewInventoryItem(
993 remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID, name, 0, callbackID, asset, invType, 993 remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID, name, 0, callbackID, asset, invType,
994 (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All, 994 (uint)PermissionMask.All, (uint)PermissionMask.All, (uint)PermissionMask.All,
995 (uint)PermissionMask.All, (uint)PermissionMask.All, Util.UnixTimeSinceEpoch()); 995 (uint)PermissionMask.All, (uint)PermissionMask.All, Util.UnixTimeSinceEpoch());
996 } 996 }
997 else 997 else
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index e3bd527..32c7262 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -77,7 +77,12 @@ namespace OpenSim.Region.Framework.Scenes
77 public bool DebugUpdates { get; private set; } 77 public bool DebugUpdates { get; private set; }
78 78
79 public SynchronizeSceneHandler SynchronizeScene; 79 public SynchronizeSceneHandler SynchronizeScene;
80 public SimStatsReporter StatsReporter; 80
81 /// <summary>
82 /// Statistical information for this scene.
83 /// </summary>
84 public SimStatsReporter StatsReporter { get; private set; }
85
81 public List<Border> NorthBorders = new List<Border>(); 86 public List<Border> NorthBorders = new List<Border>();
82 public List<Border> EastBorders = new List<Border>(); 87 public List<Border> EastBorders = new List<Border>();
83 public List<Border> SouthBorders = new List<Border>(); 88 public List<Border> SouthBorders = new List<Border>();
@@ -164,7 +169,6 @@ namespace OpenSim.Region.Framework.Scenes
164 protected IConfigSource m_config; 169 protected IConfigSource m_config;
165 protected IRegionSerialiserModule m_serialiser; 170 protected IRegionSerialiserModule m_serialiser;
166 protected IDialogModule m_dialogModule; 171 protected IDialogModule m_dialogModule;
167 protected IEntityTransferModule m_teleportModule;
168 protected ICapabilitiesModule m_capsModule; 172 protected ICapabilitiesModule m_capsModule;
169 protected IGroupsModule m_groupsModule; 173 protected IGroupsModule m_groupsModule;
170 174
@@ -515,6 +519,7 @@ namespace OpenSim.Region.Framework.Scenes
515 } 519 }
516 520
517 public IAttachmentsModule AttachmentsModule { get; set; } 521 public IAttachmentsModule AttachmentsModule { get; set; }
522 public IEntityTransferModule EntityTransferModule { get; private set; }
518 523
519 public IAvatarFactoryModule AvatarFactory 524 public IAvatarFactoryModule AvatarFactory
520 { 525 {
@@ -952,8 +957,8 @@ namespace OpenSim.Region.Framework.Scenes
952 List<ulong> old = new List<ulong>(); 957 List<ulong> old = new List<ulong>();
953 old.Add(otherRegion.RegionHandle); 958 old.Add(otherRegion.RegionHandle);
954 agent.DropOldNeighbours(old); 959 agent.DropOldNeighbours(old);
955 if (m_teleportModule != null && agent.PresenceType != PresenceType.Npc) 960 if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc)
956 m_teleportModule.EnableChildAgent(agent, otherRegion); 961 EntityTransferModule.EnableChildAgent(agent, otherRegion);
957 }); 962 });
958 } 963 }
959 catch (NullReferenceException) 964 catch (NullReferenceException)
@@ -1060,13 +1065,13 @@ namespace OpenSim.Region.Framework.Scenes
1060 } 1065 }
1061 } 1066 }
1062 1067
1068 m_log.Error("[REGION]: Closing");
1069 Close();
1070
1063 if (PhysicsScene != null) 1071 if (PhysicsScene != null)
1064 { 1072 {
1065 PhysicsScene.Dispose(); 1073 PhysicsScene.Dispose();
1066 } 1074 }
1067
1068 m_log.Error("[REGION]: Closing");
1069 Close();
1070 1075
1071 m_log.Error("[REGION]: Firing Region Restart Message"); 1076 m_log.Error("[REGION]: Firing Region Restart Message");
1072 1077
@@ -1090,8 +1095,8 @@ namespace OpenSim.Region.Framework.Scenes
1090 { 1095 {
1091 ForEachRootScenePresence(delegate(ScenePresence agent) 1096 ForEachRootScenePresence(delegate(ScenePresence agent)
1092 { 1097 {
1093 if (m_teleportModule != null && agent.PresenceType != PresenceType.Npc) 1098 if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc)
1094 m_teleportModule.EnableChildAgent(agent, r); 1099 EntityTransferModule.EnableChildAgent(agent, r);
1095 }); 1100 });
1096 } 1101 }
1097 catch (NullReferenceException) 1102 catch (NullReferenceException)
@@ -1281,7 +1286,7 @@ namespace OpenSim.Region.Framework.Scenes
1281 m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); 1286 m_serialiser = RequestModuleInterface<IRegionSerialiserModule>();
1282 m_dialogModule = RequestModuleInterface<IDialogModule>(); 1287 m_dialogModule = RequestModuleInterface<IDialogModule>();
1283 m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); 1288 m_capsModule = RequestModuleInterface<ICapabilitiesModule>();
1284 m_teleportModule = RequestModuleInterface<IEntityTransferModule>(); 1289 EntityTransferModule = RequestModuleInterface<IEntityTransferModule>();
1285 m_groupsModule = RequestModuleInterface<IGroupsModule>(); 1290 m_groupsModule = RequestModuleInterface<IGroupsModule>();
1286 } 1291 }
1287 1292
@@ -2380,8 +2385,8 @@ namespace OpenSim.Region.Framework.Scenes
2380 return; 2385 return;
2381 } 2386 }
2382 2387
2383 if (m_teleportModule != null) 2388 if (EntityTransferModule != null)
2384 m_teleportModule.Cross(grp, attemptedPosition, silent); 2389 EntityTransferModule.Cross(grp, attemptedPosition, silent);
2385 } 2390 }
2386 2391
2387 public Border GetCrossedBorder(Vector3 position, Cardinals gridline) 2392 public Border GetCrossedBorder(Vector3 position, Cardinals gridline)
@@ -3225,8 +3230,10 @@ namespace OpenSim.Region.Framework.Scenes
3225 /// <param name="client">The IClientAPI for the client</param> 3230 /// <param name="client">The IClientAPI for the client</param>
3226 public virtual bool TeleportClientHome(UUID agentId, IClientAPI client) 3231 public virtual bool TeleportClientHome(UUID agentId, IClientAPI client)
3227 { 3232 {
3228 if (m_teleportModule != null) 3233 if (EntityTransferModule != null)
3229 return m_teleportModule.TeleportHome(agentId, client); 3234 {
3235 EntityTransferModule.TeleportHome(agentId, client);
3236 }
3230 else 3237 else
3231 { 3238 {
3232 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active"); 3239 m_log.DebugFormat("[SCENE]: Unable to teleport user home: no AgentTransferModule is active");
@@ -4332,8 +4339,10 @@ namespace OpenSim.Region.Framework.Scenes
4332 position.Y -= shifty; 4339 position.Y -= shifty;
4333 } 4340 }
4334 4341
4335 if (m_teleportModule != null) 4342 if (EntityTransferModule != null)
4336 m_teleportModule.Teleport(sp, regionHandle, position, lookAt, teleportFlags); 4343 {
4344 EntityTransferModule.Teleport(sp, regionHandle, position, lookAt, teleportFlags);
4345 }
4337 else 4346 else
4338 { 4347 {
4339 m_log.DebugFormat("[SCENE]: Unable to perform teleports: no AgentTransferModule is active"); 4348 m_log.DebugFormat("[SCENE]: Unable to perform teleports: no AgentTransferModule is active");
@@ -4344,8 +4353,10 @@ namespace OpenSim.Region.Framework.Scenes
4344 4353
4345 public bool CrossAgentToNewRegion(ScenePresence agent, bool isFlying) 4354 public bool CrossAgentToNewRegion(ScenePresence agent, bool isFlying)
4346 { 4355 {
4347 if (m_teleportModule != null) 4356 if (EntityTransferModule != null)
4348 return m_teleportModule.Cross(agent, isFlying); 4357 {
4358 return EntityTransferModule.Cross(agent, isFlying);
4359 }
4349 else 4360 else
4350 { 4361 {
4351 m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule"); 4362 m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule");
@@ -5493,16 +5504,36 @@ Environment.Exit(1);
5493 throw new Exception(error); 5504 throw new Exception(error);
5494 } 5505 }
5495 5506
5496 // This method is called across the simulation connector to 5507 /// <summary>
5497 // determine if a given agent is allowed in this region 5508 /// This method is called across the simulation connector to
5498 // AS A ROOT AGENT. Returning false here will prevent them 5509 /// determine if a given agent is allowed in this region
5499 // from logging into the region, teleporting into the region 5510 /// AS A ROOT AGENT
5500 // or corssing the broder walking, but will NOT prevent 5511 /// </summary>
5501 // child agent creation, thereby emulating the SL behavior. 5512 /// <remarks>
5513 /// Returning false here will prevent them
5514 /// from logging into the region, teleporting into the region
5515 /// or corssing the broder walking, but will NOT prevent
5516 /// child agent creation, thereby emulating the SL behavior.
5517 /// </remarks>
5518 /// <param name='agentID'></param>
5519 /// <param name='position'></param>
5520 /// <param name='reason'></param>
5521 /// <returns></returns>
5502 public bool QueryAccess(UUID agentID, Vector3 position, out string reason) 5522 public bool QueryAccess(UUID agentID, Vector3 position, out string reason)
5503 { 5523 {
5504 reason = "You are banned from the region"; 5524 reason = "You are banned from the region";
5505 5525
5526 if (EntityTransferModule.IsInTransit(agentID))
5527 {
5528 reason = "Agent is still in transit from this region";
5529
5530 m_log.WarnFormat(
5531 "[SCENE]: Denying agent {0} entry into {1} since region still has them registered as in transit",
5532 agentID, RegionInfo.RegionName);
5533
5534 return false;
5535 }
5536
5506 if (Permissions.IsGod(agentID)) 5537 if (Permissions.IsGod(agentID))
5507 { 5538 {
5508 reason = String.Empty; 5539 reason = String.Empty;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 141cf66..f5b9825 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -759,14 +759,22 @@ namespace OpenSim.Region.Framework.Scenes
759 return item; 759 return item;
760 } 760 }
761 761
762 /// <summary> 762 public TaskInventoryItem GetInventoryItem(string name)
763 /// Get inventory items by name. 763 {
764 /// </summary> 764 m_items.LockItemsForRead(true);
765 /// <param name="name"></param> 765 foreach (TaskInventoryItem item in m_items.Values)
766 /// <returns> 766 {
767 /// A list of inventory items with that name. 767 if (item.Name == name)
768 /// If no inventory item has that name then an empty list is returned. 768 {
769 /// </returns> 769 return item;
770 m_items.LockItemsForRead(false);
771 }
772 }
773 m_items.LockItemsForRead(false);
774
775 return null;
776 }
777
770 public List<TaskInventoryItem> GetInventoryItems(string name) 778 public List<TaskInventoryItem> GetInventoryItems(string name)
771 { 779 {
772 List<TaskInventoryItem> items = new List<TaskInventoryItem>(); 780 List<TaskInventoryItem> items = new List<TaskInventoryItem>();
@@ -1236,10 +1244,10 @@ namespace OpenSim.Region.Framework.Scenes
1236 if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) 1244 if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
1237 item.CurrentPermissions &= ~(uint)PermissionMask.Modify; 1245 item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
1238 } 1246 }
1239 item.OwnerChanged = true;
1240 item.CurrentPermissions &= item.NextPermissions; 1247 item.CurrentPermissions &= item.NextPermissions;
1241 item.BasePermissions &= item.NextPermissions; 1248 item.BasePermissions &= item.NextPermissions;
1242 item.EveryonePermissions &= item.NextPermissions; 1249 item.EveryonePermissions &= item.NextPermissions;
1250 item.OwnerChanged = true;
1243 item.PermsMask = 0; 1251 item.PermsMask = 0;
1244 item.PermsGranter = UUID.Zero; 1252 item.PermsGranter = UUID.Zero;
1245 } 1253 }
@@ -1432,4 +1440,4 @@ namespace OpenSim.Region.Framework.Scenes
1432 } 1440 }
1433 } 1441 }
1434 } 1442 }
1435} \ No newline at end of file 1443}
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs
index 55455cc..a4f730d 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/CoalescedSceneObjectsSerializer.cs
@@ -47,14 +47,30 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
47 /// </remarks> 47 /// </remarks>
48 public class CoalescedSceneObjectsSerializer 48 public class CoalescedSceneObjectsSerializer
49 { 49 {
50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 50 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
51 51
52 /// <summary> 52 /// <summary>
53 /// Serialize coalesced objects to Xml 53 /// Serialize coalesced objects to Xml
54 /// </summary> 54 /// </summary>
55 /// <param name="coa"></param> 55 /// <param name="coa"></param>
56 /// <param name="doScriptStates">
57 /// If true then serialize script states. This will halt any running scripts
58 /// </param>
56 /// <returns></returns> 59 /// <returns></returns>
57 public static string ToXml(CoalescedSceneObjects coa) 60 public static string ToXml(CoalescedSceneObjects coa)
61 {
62 return ToXml(coa, true);
63 }
64
65 /// <summary>
66 /// Serialize coalesced objects to Xml
67 /// </summary>
68 /// <param name="coa"></param>
69 /// <param name="doScriptStates">
70 /// If true then serialize script states. This will halt any running scripts
71 /// </param>
72 /// <returns></returns>
73 public static string ToXml(CoalescedSceneObjects coa, bool doScriptStates)
58 { 74 {
59 using (StringWriter sw = new StringWriter()) 75 using (StringWriter sw = new StringWriter())
60 { 76 {
@@ -91,7 +107,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
91 writer.WriteAttributeString("offsety", offsets[i].Y.ToString()); 107 writer.WriteAttributeString("offsety", offsets[i].Y.ToString());
92 writer.WriteAttributeString("offsetz", offsets[i].Z.ToString()); 108 writer.WriteAttributeString("offsetz", offsets[i].Z.ToString());
93 109
94 SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, true); 110 SceneObjectSerializer.ToOriginalXmlFormat(obj, writer, doScriptStates);
95 111
96 writer.WriteEndElement(); // SceneObjectGroup 112 writer.WriteEndElement(); // SceneObjectGroup
97 } 113 }
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
index 41bff7f..ccfe4ff 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTeleportTests.cs
@@ -110,12 +110,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests
110 110
111 UUID userId = TestHelpers.ParseTail(0x1); 111 UUID userId = TestHelpers.ParseTail(0x1);
112 112
113 EntityTransferModule etm = new EntityTransferModule(); 113 EntityTransferModule etmA = new EntityTransferModule();
114 EntityTransferModule etmB = new EntityTransferModule();
114 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); 115 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
115 116
116 IConfigSource config = new IniConfigSource(); 117 IConfigSource config = new IniConfigSource();
117 IConfig modulesConfig = config.AddConfig("Modules"); 118 IConfig modulesConfig = config.AddConfig("Modules");
118 modulesConfig.Set("EntityTransferModule", etm.Name); 119 modulesConfig.Set("EntityTransferModule", etmA.Name);
119 modulesConfig.Set("SimulationServices", lscm.Name); 120 modulesConfig.Set("SimulationServices", lscm.Name);
120 IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); 121 IConfig entityTransferConfig = config.AddConfig("EntityTransfer");
121 122
@@ -127,7 +128,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests
127 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); 128 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
128 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); 129 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000);
129 130
130 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); 131 SceneHelpers.SetupSceneModules(sceneA, config, etmA);
132 SceneHelpers.SetupSceneModules(sceneB, config, etmB);
133 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
131 134
132 Vector3 teleportPosition = new Vector3(10, 11, 12); 135 Vector3 teleportPosition = new Vector3(10, 11, 12);
133 Vector3 teleportLookAt = new Vector3(20, 21, 22); 136 Vector3 teleportLookAt = new Vector3(20, 21, 22);
@@ -174,12 +177,14 @@ namespace OpenSim.Region.Framework.Scenes.Tests
174 UUID userId = TestHelpers.ParseTail(0x1); 177 UUID userId = TestHelpers.ParseTail(0x1);
175 Vector3 preTeleportPosition = new Vector3(30, 31, 32); 178 Vector3 preTeleportPosition = new Vector3(30, 31, 32);
176 179
177 EntityTransferModule etm = new EntityTransferModule(); 180 EntityTransferModule etmA = new EntityTransferModule();
181 EntityTransferModule etmB = new EntityTransferModule();
182
178 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); 183 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
179 184
180 IConfigSource config = new IniConfigSource(); 185 IConfigSource config = new IniConfigSource();
181 config.AddConfig("Modules"); 186 config.AddConfig("Modules");
182 config.Configs["Modules"].Set("EntityTransferModule", etm.Name); 187 config.Configs["Modules"].Set("EntityTransferModule", etmA.Name);
183 config.Configs["Modules"].Set("SimulationServices", lscm.Name); 188 config.Configs["Modules"].Set("SimulationServices", lscm.Name);
184 189
185 config.AddConfig("EntityTransfer"); 190 config.AddConfig("EntityTransfer");
@@ -195,13 +200,15 @@ namespace OpenSim.Region.Framework.Scenes.Tests
195 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); 200 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
196 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); 201 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000);
197 202
203 SceneHelpers.SetupSceneModules(sceneA, config, etmA );
204
198 // We need to set up the permisions module on scene B so that our later use of agent limit to deny 205 // We need to set up the permisions module on scene B so that our later use of agent limit to deny
199 // QueryAccess won't succeed anyway because administrators are always allowed in and the default 206 // QueryAccess won't succeed anyway because administrators are always allowed in and the default
200 // IsAdministrator if no permissions module is present is true. 207 // IsAdministrator if no permissions module is present is true.
201 SceneHelpers.SetupSceneModules(sceneB, config, new object[] { new PermissionsModule() }); 208 SceneHelpers.SetupSceneModules(sceneB, config, new object[] { new PermissionsModule(), etmB });
202 209
203 // Shared scene modules 210 // Shared scene modules
204 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); 211 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
205 212
206 Vector3 teleportPosition = new Vector3(10, 11, 12); 213 Vector3 teleportPosition = new Vector3(10, 11, 12);
207 Vector3 teleportLookAt = new Vector3(20, 21, 22); 214 Vector3 teleportLookAt = new Vector3(20, 21, 22);
@@ -249,12 +256,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests
249 UUID userId = TestHelpers.ParseTail(0x1); 256 UUID userId = TestHelpers.ParseTail(0x1);
250 Vector3 preTeleportPosition = new Vector3(30, 31, 32); 257 Vector3 preTeleportPosition = new Vector3(30, 31, 32);
251 258
252 EntityTransferModule etm = new EntityTransferModule(); 259 EntityTransferModule etmA = new EntityTransferModule();
260 EntityTransferModule etmB = new EntityTransferModule();
253 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); 261 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
254 262
255 IConfigSource config = new IniConfigSource(); 263 IConfigSource config = new IniConfigSource();
256 config.AddConfig("Modules"); 264 config.AddConfig("Modules");
257 config.Configs["Modules"].Set("EntityTransferModule", etm.Name); 265 config.Configs["Modules"].Set("EntityTransferModule", etmA.Name);
258 config.Configs["Modules"].Set("SimulationServices", lscm.Name); 266 config.Configs["Modules"].Set("SimulationServices", lscm.Name);
259 267
260 config.AddConfig("EntityTransfer"); 268 config.AddConfig("EntityTransfer");
@@ -267,8 +275,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests
267 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); 275 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
268 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000); 276 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1002, 1000);
269 277
278 SceneHelpers.SetupSceneModules(sceneA, config, etmA);
279 SceneHelpers.SetupSceneModules(sceneB, config, etmB);
280
270 // Shared scene modules 281 // Shared scene modules
271 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); 282 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
272 283
273 Vector3 teleportPosition = new Vector3(10, 11, 12); 284 Vector3 teleportPosition = new Vector3(10, 11, 12);
274 Vector3 teleportLookAt = new Vector3(20, 21, 22); 285 Vector3 teleportLookAt = new Vector3(20, 21, 22);
@@ -312,12 +323,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests
312 323
313 UUID userId = TestHelpers.ParseTail(0x1); 324 UUID userId = TestHelpers.ParseTail(0x1);
314 325
315 EntityTransferModule etm = new EntityTransferModule(); 326 EntityTransferModule etmA = new EntityTransferModule();
327 EntityTransferModule etmB = new EntityTransferModule();
316 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule(); 328 LocalSimulationConnectorModule lscm = new LocalSimulationConnectorModule();
317 329
318 IConfigSource config = new IniConfigSource(); 330 IConfigSource config = new IniConfigSource();
319 IConfig modulesConfig = config.AddConfig("Modules"); 331 IConfig modulesConfig = config.AddConfig("Modules");
320 modulesConfig.Set("EntityTransferModule", etm.Name); 332 modulesConfig.Set("EntityTransferModule", etmA.Name);
321 modulesConfig.Set("SimulationServices", lscm.Name); 333 modulesConfig.Set("SimulationServices", lscm.Name);
322 IConfig entityTransferConfig = config.AddConfig("EntityTransfer"); 334 IConfig entityTransferConfig = config.AddConfig("EntityTransfer");
323 335
@@ -329,9 +341,9 @@ namespace OpenSim.Region.Framework.Scenes.Tests
329 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000); 341 TestScene sceneA = sh.SetupScene("sceneA", TestHelpers.ParseTail(0x100), 1000, 1000);
330 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000); 342 TestScene sceneB = sh.SetupScene("sceneB", TestHelpers.ParseTail(0x200), 1001, 1000);
331 343
332 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, etm, lscm); 344 SceneHelpers.SetupSceneModules(new Scene[] { sceneA, sceneB }, config, lscm);
333 SceneHelpers.SetupSceneModules(sceneA, new CapabilitiesModule()); 345 SceneHelpers.SetupSceneModules(sceneA, config, new CapabilitiesModule(), etmA);
334 SceneHelpers.SetupSceneModules(sceneB, new CapabilitiesModule()); 346 SceneHelpers.SetupSceneModules(sceneB, config, new CapabilitiesModule(), etmB);
335 347
336 Vector3 teleportPosition = new Vector3(10, 11, 12); 348 Vector3 teleportPosition = new Vector3(10, 11, 12);
337 Vector3 teleportLookAt = new Vector3(20, 21, 22); 349 Vector3 teleportLookAt = new Vector3(20, 21, 22);
diff --git a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs
index a95514c..1b9e3ac 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Attachments/AttachmentsCommandModule.cs
@@ -145,12 +145,12 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
145 { 145 {
146 sb.AppendFormat("Attachments for {0}\n", sp.Name); 146 sb.AppendFormat("Attachments for {0}\n", sp.Name);
147 147
148 ConsoleTable ct = new ConsoleTable() { Indent = 2 }; 148 ConsoleDisplayTable ct = new ConsoleDisplayTable() { Indent = 2 };
149 ct.Columns.Add(new ConsoleTableColumn("Attachment Name", 36)); 149 ct.Columns.Add(new ConsoleDisplayTableColumn("Attachment Name", 36));
150 ct.Columns.Add(new ConsoleTableColumn("Local ID", 10)); 150 ct.Columns.Add(new ConsoleDisplayTableColumn("Local ID", 10));
151 ct.Columns.Add(new ConsoleTableColumn("Item ID", 36)); 151 ct.Columns.Add(new ConsoleDisplayTableColumn("Item ID", 36));
152 ct.Columns.Add(new ConsoleTableColumn("Attach Point", 14)); 152 ct.Columns.Add(new ConsoleDisplayTableColumn("Attach Point", 14));
153 ct.Columns.Add(new ConsoleTableColumn("Position", 15)); 153 ct.Columns.Add(new ConsoleDisplayTableColumn("Position", 15));
154 154
155// sb.AppendFormat( 155// sb.AppendFormat(
156// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n", 156// " {0,-36} {1,-10} {2,-36} {3,-14} {4,-15}\n",
@@ -176,7 +176,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Attachments
176// attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID, 176// attachmentObject.Name, attachmentObject.LocalId, attachmentObject.FromItemID,
177// (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos); 177// (AttachmentPoint)attachmentObject.AttachmentPoint, attachmentObject.RootPart.AttachedPos);
178 ct.Rows.Add( 178 ct.Rows.Add(
179 new ConsoleTableRow( 179 new ConsoleDisplayTableRow(
180 new List<string>() 180 new List<string>()
181 { 181 {
182 attachmentObject.Name, 182 attachmentObject.Name,
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 0cc3e8c..03f4108 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -354,51 +354,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
354 354
355 protected UUID InventoryKey(string name, int type) 355 protected UUID InventoryKey(string name, int type)
356 { 356 {
357 m_host.AddScriptLPS(1); 357 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
358 m_host.TaskInventory.LockItemsForRead(true);
359
360 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
361 {
362 if (inv.Value.Name == name)
363 {
364 m_host.TaskInventory.LockItemsForRead(false);
365
366 if (inv.Value.Type != type)
367 {
368 return UUID.Zero;
369 }
370 358
371 return inv.Value.AssetID; 359 if (item != null && item.Type == type)
372 } 360 return item.AssetID;
373 } 361 else
374 362 return UUID.Zero;
375 m_host.TaskInventory.LockItemsForRead(false);
376 return UUID.Zero;
377 }
378
379 protected UUID InventoryKey(string name)
380 {
381 m_host.AddScriptLPS(1);
382
383
384 m_host.TaskInventory.LockItemsForRead(true);
385
386 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
387 {
388 if (inv.Value.Name == name)
389 {
390 m_host.TaskInventory.LockItemsForRead(false);
391 return inv.Value.AssetID;
392 }
393 }
394
395 m_host.TaskInventory.LockItemsForRead(false);
396
397
398 return UUID.Zero;
399 } 363 }
400 364
401
402 /// <summary> 365 /// <summary>
403 /// accepts a valid UUID, -or- a name of an inventory item. 366 /// accepts a valid UUID, -or- a name of an inventory item.
404 /// Returns a valid UUID or UUID.Zero if key invalid and item not found 367 /// Returns a valid UUID or UUID.Zero if key invalid and item not found
@@ -408,19 +371,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
408 /// <returns></returns> 371 /// <returns></returns>
409 protected UUID KeyOrName(string k) 372 protected UUID KeyOrName(string k)
410 { 373 {
411 UUID key = UUID.Zero; 374 UUID key;
412 375
413 // if we can parse the string as a key, use it. 376 // if we can parse the string as a key, use it.
414 if (UUID.TryParse(k, out key))
415 {
416 return key;
417 }
418 // else try to locate the name in inventory of object. found returns key, 377 // else try to locate the name in inventory of object. found returns key,
419 // not found returns UUID.Zero which will translate to the default particle texture 378 // not found returns UUID.Zero
420 else 379 if (!UUID.TryParse(k, out key))
421 { 380 {
422 return InventoryKey(k); 381 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
382
383 if (item != null)
384 key = item.AssetID;
385 else
386 key = UUID.Zero;
423 } 387 }
388
389 return key;
424 } 390 }
425 391
426 // convert a LSL_Rotation to a Quaternion 392 // convert a LSL_Rotation to a Quaternion
@@ -1897,14 +1863,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1897 1863
1898 return rgb; 1864 return rgb;
1899 } 1865 }
1866
1900 if (face >= 0 && face < GetNumberOfSides(part)) 1867 if (face >= 0 && face < GetNumberOfSides(part))
1901 { 1868 {
1902 texcolor = tex.GetFace((uint)face).RGBA; 1869 texcolor = tex.GetFace((uint)face).RGBA;
1903 rgb.x = texcolor.R; 1870 rgb.x = texcolor.R;
1904 rgb.y = texcolor.G; 1871 rgb.y = texcolor.G;
1905 rgb.z = texcolor.B; 1872 rgb.z = texcolor.B;
1873
1906 return rgb; 1874 return rgb;
1907
1908 } 1875 }
1909 else 1876 else
1910 { 1877 {
@@ -3598,17 +3565,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3598 3565
3599 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) 3566 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION) != 0)
3600 { 3567 {
3601 UUID animID = new UUID();
3602
3603 if (!UUID.TryParse(anim, out animID))
3604 {
3605 animID = InventoryKey(anim);
3606 }
3607
3608 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); 3568 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
3609 3569
3610 if (presence != null) 3570 if (presence != null)
3611 { 3571 {
3572 UUID animID = KeyOrName(anim);
3573
3612 if (animID == UUID.Zero) 3574 if (animID == UUID.Zero)
3613 presence.Animator.RemoveAnimation(anim); 3575 presence.Animator.RemoveAnimation(anim);
3614 else 3576 else
@@ -3737,9 +3699,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3737 } 3699 }
3738 3700
3739 ScenePresence presence = World.GetScenePresence(agentID); 3701 ScenePresence presence = World.GetScenePresence(agentID);
3740
3741 if (presence != null) 3702 if (presence != null)
3742 { 3703 {
3704 // If permissions are being requested from an NPC and were not implicitly granted above then
3705 // auto grant all reuqested permissions if the script is owned by the NPC or the NPCs owner
3706 INPCModule npcModule = World.RequestModuleInterface<INPCModule>();
3707 if (npcModule != null && npcModule.IsNPC(agentID, World))
3708 {
3709 if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID)
3710 {
3711 lock (m_host.TaskInventory)
3712 {
3713 m_host.TaskInventory[m_item.ItemID].PermsGranter = agentID;
3714 m_host.TaskInventory[m_item.ItemID].PermsMask = perm;
3715 }
3716
3717 m_ScriptEngine.PostScriptEvent(
3718 m_item.ItemID,
3719 new EventParams(
3720 "run_time_permissions", new Object[] { new LSL_Integer(perm) }, new DetectParams[0]));
3721 }
3722
3723 // it is an NPC, exit even if the permissions werent granted above, they are not going to answer
3724 // the question!
3725 return;
3726 }
3727
3743 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID); 3728 string ownerName = resolveName(m_host.ParentGroup.RootPart.OwnerID);
3744 if (ownerName == String.Empty) 3729 if (ownerName == String.Empty)
3745 ownerName = "(hippos)"; 3730 ownerName = "(hippos)";
@@ -3762,10 +3747,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3762 } 3747 }
3763 3748
3764 // Requested agent is not in range, refuse perms 3749 // Requested agent is not in range, refuse perms
3765 m_ScriptEngine.PostScriptEvent(m_item.ItemID, new EventParams( 3750 m_ScriptEngine.PostScriptEvent(
3766 "run_time_permissions", new Object[] { 3751 m_item.ItemID,
3767 new LSL_Integer(0) }, 3752 new EventParams("run_time_permissions", new Object[] { new LSL_Integer(0) }, new DetectParams[0]));
3768 new DetectParams[0]));
3769 } 3753 }
3770 3754
3771 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer) 3755 void handleScriptAnswer(IClientAPI client, UUID taskID, UUID itemID, int answer)
@@ -9456,7 +9440,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9456 public LSL_String llGetSimulatorHostname() 9440 public LSL_String llGetSimulatorHostname()
9457 { 9441 {
9458 m_host.AddScriptLPS(1); 9442 m_host.AddScriptLPS(1);
9459 return System.Environment.MachineName; 9443 IUrlModule UrlModule = World.RequestModuleInterface<IUrlModule>();
9444 return UrlModule.ExternalHostNameForLSL;
9460 } 9445 }
9461 9446
9462 // <summary> 9447 // <summary>
@@ -9811,7 +9796,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9811 9796
9812 GridRegion info; 9797 GridRegion info;
9813 9798
9814 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) 9799 if (m_ScriptEngine.World.RegionInfo.RegionName == simulator) //Det data for this simulator?
9800
9815 info = new GridRegion(m_ScriptEngine.World.RegionInfo); 9801 info = new GridRegion(m_ScriptEngine.World.RegionInfo);
9816 else 9802 else
9817 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator); 9803 info = m_ScriptEngine.World.GridService.GetRegionByName(m_ScriptEngine.World.RegionInfo.ScopeID, simulator);
@@ -9824,10 +9810,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9824 ScriptSleep(1000); 9810 ScriptSleep(1000);
9825 return UUID.Zero.ToString(); 9811 return UUID.Zero.ToString();
9826 } 9812 }
9827 reply = new LSL_Vector( 9813 if (m_ScriptEngine.World.RegionInfo.RegionName != simulator)
9828 info.RegionLocX, 9814 {
9829 info.RegionLocY, 9815 //Hypergrid Region co-ordinates
9830 0).ToString(); 9816 uint rx = 0, ry = 0;
9817 Utils.LongToUInts(Convert.ToUInt64(info.RegionSecret), out rx, out ry);
9818
9819 reply = new LSL_Vector(
9820 rx,
9821 ry,
9822 0).ToString();
9823 }
9824 else
9825 {
9826 //Local-cooridnates
9827 reply = new LSL_Vector(
9828 info.RegionLocX,
9829 info.RegionLocY,
9830 0).ToString();
9831 }
9831 break; 9832 break;
9832 case ScriptBaseClass.DATA_SIM_STATUS: 9833 case ScriptBaseClass.DATA_SIM_STATUS:
9833 if (info != null) 9834 if (info != null)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 51ace1a..8237b60 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -960,21 +960,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
960 UUID avatarID = (UUID)avatar; 960 UUID avatarID = (UUID)avatar;
961 961
962 m_host.AddScriptLPS(1); 962 m_host.AddScriptLPS(1);
963
964 // FIXME: What we really want to do here is factor out the similar code in llStopAnimation() to a common
965 // method (though see that doesn't do the is animation check, which is probably a bug) and have both
966 // these functions call that common code. However, this does mean navigating the brain-dead requirement
967 // of calling InitLSL()
963 if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) 968 if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence)
964 { 969 {
965 ScenePresence target = (ScenePresence)World.Entities[avatarID]; 970 ScenePresence target = (ScenePresence)World.Entities[avatarID];
966 if (target != null) 971 if (target != null)
967 { 972 {
968 UUID animID = UUID.Zero; 973 UUID animID;
969 m_host.TaskInventory.LockItemsForRead(true); 974
970 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 975 if (!UUID.TryParse(animation, out animID))
971 { 976 {
972 if (inv.Value.Name == animation) 977 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(animation);
973 { 978 if (item != null && item.Type == (int)AssetType.Animation)
974 if (inv.Value.Type == (int)AssetType.Animation) 979 animID = item.AssetID;
975 animID = inv.Value.AssetID; 980 else
976 continue; 981 animID = UUID.Zero;
977 }
978 } 982 }
979 m_host.TaskInventory.LockItemsForRead(false); 983 m_host.TaskInventory.LockItemsForRead(false);
980 984