aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Interfaces/IAgentTransferModule.cs (renamed from OpenSim/Region/Framework/Interfaces/ITeleportModule.cs)17
-rw-r--r--OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs4
-rw-r--r--OpenSim/Region/Framework/Interfaces/IPresenceModule.cs10
-rw-r--r--OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs9
-rw-r--r--OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.cs77
-rw-r--r--OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs391
-rw-r--r--OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs42
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs73
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs348
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneBase.cs13
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs1203
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneManager.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs63
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneViewer.cs1
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs14
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs9
22 files changed, 347 insertions, 1946 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/ITeleportModule.cs b/OpenSim/Region/Framework/Interfaces/IAgentTransferModule.cs
index 5f9129d..76745d6 100644
--- a/OpenSim/Region/Framework/Interfaces/ITeleportModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAgentTransferModule.cs
@@ -26,16 +26,25 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using OpenSim.Services.Interfaces;
30using System.Text; 30using GridRegion = OpenSim.Services.Interfaces.GridRegion;
31
31using OpenMetaverse; 32using OpenMetaverse;
32using OpenSim.Region.Framework.Scenes; 33using OpenSim.Region.Framework.Scenes;
33 34
34namespace OpenSim.Region.Framework.Interfaces 35namespace OpenSim.Region.Framework.Interfaces
35{ 36{
36 public interface ITeleportModule 37 public interface IAgentTransferModule
37 { 38 {
38 void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position, 39 void Teleport(ScenePresence agent, ulong regionHandle, Vector3 position,
39 Vector3 lookAt, uint teleportFlags); 40 Vector3 lookAt, uint teleportFlags);
41
42 void Cross(ScenePresence agent, bool isFlying);
43
44 void AgentArrivedAtDestination(UUID agent);
45
46 void EnableChildAgents(ScenePresence agent);
47
48 void EnableChildAgent(ScenePresence agent, GridRegion region);
40 } 49 }
41} 50}
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs
index 2d038ce..fbadd91 100644
--- a/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInventoryArchiverModule.cs
@@ -27,7 +27,7 @@
27 27
28using System; 28using System;
29using System.IO; 29using System.IO;
30using OpenSim.Framework.Communications.Cache; 30using OpenSim.Services.Interfaces;
31 31
32namespace OpenSim.Region.Framework.Interfaces 32namespace OpenSim.Region.Framework.Interfaces
33{ 33{
@@ -41,7 +41,7 @@ namespace OpenSim.Region.Framework.Interfaces
41 /// <param name="savePath">The stream to which the archive was saved</param> 41 /// <param name="savePath">The stream to which the archive was saved</param>
42 /// <param name="reportedException">Contains the exception generated if the save did not succeed</param> 42 /// <param name="reportedException">Contains the exception generated if the save did not succeed</param>
43 public delegate void InventoryArchiveSaved( 43 public delegate void InventoryArchiveSaved(
44 Guid id, bool succeeded, CachedUserInfo userInfo, string invPath, Stream saveStream, Exception reportedException); 44 Guid id, bool succeeded, UserAccount userInfo, string invPath, Stream saveStream, Exception reportedException);
45 45
46 public interface IInventoryArchiverModule 46 public interface IInventoryArchiverModule
47 { 47 {
diff --git a/OpenSim/Region/Framework/Interfaces/IPresenceModule.cs b/OpenSim/Region/Framework/Interfaces/IPresenceModule.cs
index 630c6a3..d44c1e1 100644
--- a/OpenSim/Region/Framework/Interfaces/IPresenceModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IPresenceModule.cs
@@ -31,13 +31,13 @@ namespace OpenSim.Region.Framework.Interfaces
31{ 31{
32 public struct PresenceInfo 32 public struct PresenceInfo
33 { 33 {
34 public UUID userID; 34 public string UserID;
35 public UUID regionID; 35 public UUID RegionID;
36 36
37 public PresenceInfo(UUID userID, UUID regionID) 37 public PresenceInfo(string userID, UUID regionID)
38 { 38 {
39 this.userID = userID; 39 UserID = userID;
40 this.regionID = regionID; 40 RegionID = regionID;
41 } 41 }
42 } 42 }
43 43
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
index ec50598..fdda150 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGAssetMapper.cs
@@ -32,8 +32,7 @@ using System.Threading;
32using log4net; 32using log4net;
33using OpenMetaverse; 33using OpenMetaverse;
34using OpenSim.Framework; 34using OpenSim.Framework;
35using OpenSim.Framework.Communications.Cache; 35
36using OpenSim.Framework.Communications.Clients;
37using OpenSim.Region.Framework.Scenes.Serialization; 36using OpenSim.Region.Framework.Scenes.Serialization;
38using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Services.Interfaces; 38using OpenSim.Services.Interfaces;
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
index 6f7f34f..c5f8921 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
@@ -31,8 +31,9 @@ using Nini.Config;
31using OpenMetaverse; 31using OpenMetaverse;
32using OpenSim.Framework; 32using OpenSim.Framework;
33using OpenSim.Framework.Communications; 33using OpenSim.Framework.Communications;
34using OpenSim.Framework.Communications.Cache; 34
35using OpenSim.Region.Framework.Interfaces; 35using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Services.Interfaces;
36 37
37namespace OpenSim.Region.Framework.Scenes.Hypergrid 38namespace OpenSim.Region.Framework.Scenes.Hypergrid
38{ 39{
@@ -63,11 +64,11 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
63 #region Constructors 64 #region Constructors
64 65
65 public HGScene(RegionInfo regInfo, AgentCircuitManager authen, 66 public HGScene(RegionInfo regInfo, AgentCircuitManager authen,
66 CommunicationsManager commsMan, SceneCommunicationService sceneGridService, 67 SceneCommunicationService sceneGridService,
67 StorageManager storeManager, 68 StorageManager storeManager,
68 ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, 69 ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim,
69 bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) 70 bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion)
70 : base(regInfo, authen, commsMan, sceneGridService, storeManager, moduleLoader, 71 : base(regInfo, authen, sceneGridService, storeManager, moduleLoader,
71 dumpAssetsToFile, physicalPrim, SeeIntoRegionFromNeighbor, config, simulatorVersion) 72 dumpAssetsToFile, physicalPrim, SeeIntoRegionFromNeighbor, config, simulatorVersion)
72 { 73 {
73 m_log.Info("[HGScene]: Starting HGScene."); 74 m_log.Info("[HGScene]: Starting HGScene.");
@@ -82,7 +83,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
82 83
83 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) 84 public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel)
84 { 85 {
85 CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(avatarID); 86 UserAccount userInfo = UserAccountService.GetUserAccount(RegionInfo.ScopeID, avatarID);
86 if (userInfo != null) 87 if (userInfo != null)
87 { 88 {
88 m_assMapper.Post(assetID, avatarID); 89 m_assMapper.Post(assetID, avatarID);
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.cs
deleted file mode 100644
index b1981b6..0000000
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.cs
+++ /dev/null
@@ -1,77 +0,0 @@
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;
29using OpenSim.Framework;
30using OpenSim.Framework.Communications.Cache;
31using TPFlags = OpenSim.Framework.Constants.TeleportFlags;
32using GridRegion = OpenSim.Services.Interfaces.GridRegion;
33
34namespace OpenSim.Region.Framework.Scenes.Hypergrid
35{
36 public partial class HGScene : Scene
37 {
38 /// <summary>
39 /// Teleport an avatar to their home region
40 /// </summary>
41 /// <param name="agentId"></param>
42 /// <param name="client"></param>
43 public override void TeleportClientHome(UUID agentId, IClientAPI client)
44 {
45 m_log.Debug("[HGScene]: TeleportClientHome " + client.FirstName + " " + client.LastName);
46
47 CachedUserInfo uinfo = CommsManager.UserProfileCacheService.GetUserDetails(agentId);
48 if (uinfo != null)
49 {
50 UserProfileData UserProfile = uinfo.UserProfile;
51
52 if (UserProfile != null)
53 {
54 GridRegion regionInfo = GridService.GetRegionByUUID(UUID.Zero, UserProfile.HomeRegionID);
55 //if (regionInfo != null)
56 //{
57 // UserProfile.HomeRegionID = regionInfo.RegionID;
58 // //CommsManager.UserService.UpdateUserProfile(UserProfile);
59 //}
60 if (regionInfo == null)
61 {
62 // can't find the Home region: Tell viewer and abort
63 client.SendTeleportFailed("Your home-region could not be found.");
64 return;
65 }
66 RequestTeleportLocation(
67 client, regionInfo.RegionHandle, UserProfile.HomeLocation, UserProfile.HomeLookAt,
68 (uint)(TPFlags.SetLastToTarget | TPFlags.ViaHome));
69 }
70 }
71 else
72 client.SendTeleportFailed("Sorry! I lost your home-region information.");
73
74 }
75
76 }
77}
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
deleted file mode 100644
index 416826c..0000000
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
+++ /dev/null
@@ -1,391 +0,0 @@
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.Net;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using OpenSim.Framework.Client;
37using OpenSim.Framework.Communications;
38using OpenSim.Framework.Communications.Cache;
39using OpenSim.Framework.Capabilities;
40using OpenSim.Region.Framework.Interfaces;
41using OpenSim.Services.Interfaces;
42using GridRegion = OpenSim.Services.Interfaces.GridRegion;
43
44namespace OpenSim.Region.Framework.Scenes.Hypergrid
45{
46 public class HGSceneCommunicationService : SceneCommunicationService
47 {
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49
50 private IHyperlinkService m_hg;
51 IHyperlinkService HyperlinkService
52 {
53 get
54 {
55 if (m_hg == null)
56 m_hg = m_scene.RequestModuleInterface<IHyperlinkService>();
57 return m_hg;
58 }
59 }
60
61 public HGSceneCommunicationService(CommunicationsManager commsMan) : base(commsMan)
62 {
63 }
64
65
66 /// <summary>
67 /// Try to teleport an agent to a new region.
68 /// </summary>
69 /// <param name="remoteClient"></param>
70 /// <param name="RegionHandle"></param>
71 /// <param name="position"></param>
72 /// <param name="lookAt"></param>
73 /// <param name="flags"></param>
74 public override void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position,
75 Vector3 lookAt, uint teleportFlags)
76 {
77 if (!avatar.Scene.Permissions.CanTeleport(avatar.UUID))
78 return;
79
80 bool destRegionUp = true;
81
82 IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>();
83
84 // Reset animations; the viewer does that in teleports.
85 avatar.Animator.ResetAnimations();
86
87 if (regionHandle == m_regionInfo.RegionHandle)
88 {
89 // Teleport within the same region
90 if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0)
91 {
92 Vector3 emergencyPos = new Vector3(128, 128, 128);
93
94 m_log.WarnFormat(
95 "[HGSceneCommService]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
96 position, avatar.Name, avatar.UUID, emergencyPos);
97 position = emergencyPos;
98 }
99 // TODO: Get proper AVG Height
100 float localAVHeight = 1.56f;
101
102 float posZLimit = 22;
103
104 if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <= (int)Constants.RegionSize)
105 {
106 posZLimit = (float) avatar.Scene.Heightmap[(int) position.X, (int) position.Y];
107 }
108
109 float newPosZ = posZLimit + localAVHeight;
110 if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
111 {
112 position.Z = newPosZ;
113 }
114
115 // Only send this if the event queue is null
116 if (eq == null)
117 avatar.ControllingClient.SendTeleportLocationStart();
118
119
120 avatar.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags);
121 avatar.Teleport(position);
122 }
123 else
124 {
125 uint x = 0, y = 0;
126 Utils.LongToUInts(regionHandle, out x, out y);
127 GridRegion reg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y);
128
129 if (reg != null)
130 {
131
132 uint newRegionX = (uint)(reg.RegionHandle >> 40);
133 uint newRegionY = (((uint)(reg.RegionHandle)) >> 8);
134 uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40);
135 uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8);
136
137 ///
138 /// Hypergrid mod start
139 ///
140 ///
141 bool isHyperLink = (HyperlinkService.GetHyperlinkRegion(reg.RegionHandle) != null);
142 bool isHomeUser = true;
143 ulong realHandle = regionHandle;
144 CachedUserInfo uinfo = m_commsProvider.UserProfileCacheService.GetUserDetails(avatar.UUID);
145 if (uinfo != null)
146 {
147 isHomeUser = HyperlinkService.IsLocalUser(uinfo.UserProfile.ID);
148 realHandle = m_hg.FindRegionHandle(regionHandle);
149 m_log.Debug("XXX ---- home user? " + isHomeUser + " --- hyperlink? " + isHyperLink + " --- real handle: " + realHandle.ToString());
150 }
151 ///
152 /// Hypergrid mod stop
153 ///
154 ///
155
156 if (eq == null)
157 avatar.ControllingClient.SendTeleportLocationStart();
158
159
160 // Let's do DNS resolution only once in this process, please!
161 // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field,
162 // it's actually doing a lot of work.
163 IPEndPoint endPoint = reg.ExternalEndPoint;
164 if (endPoint.Address == null)
165 {
166 // Couldn't resolve the name. Can't TP, because the viewer wants IP addresses.
167 destRegionUp = false;
168 }
169
170 if (destRegionUp)
171 {
172 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from
173 // both regions
174 if (avatar.ParentID != (uint)0)
175 avatar.StandUp();
176
177 if (!avatar.ValidateAttachments())
178 {
179 avatar.ControllingClient.SendTeleportFailed("Inconsistent attachment state");
180 return;
181 }
182
183 // the avatar.Close below will clear the child region list. We need this below for (possibly)
184 // closing the child agents, so save it here (we need a copy as it is Clear()-ed).
185 //List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList());
186 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
187 // failure at this point (unlike a border crossing failure). So perhaps this can never fail
188 // once we reach here...
189 //avatar.Scene.RemoveCapsHandler(avatar.UUID);
190
191 string capsPath = String.Empty;
192 AgentCircuitData agentCircuit = avatar.ControllingClient.RequestClientInfo();
193 agentCircuit.BaseFolder = UUID.Zero;
194 agentCircuit.InventoryFolder = UUID.Zero;
195 agentCircuit.startpos = position;
196 agentCircuit.child = true;
197 if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY))
198 {
199 // brand new agent, let's create a new caps seed
200 agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath();
201 }
202
203 string reason = String.Empty;
204
205 //if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agentCircuit))
206 if (!m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, agentCircuit, teleportFlags, out reason))
207 {
208 avatar.ControllingClient.SendTeleportFailed(String.Format("Destination is not accepting teleports: {0}",
209 reason));
210 return;
211 }
212
213 // Let's close some agents
214 if (isHyperLink) // close them all except this one
215 {
216 List<ulong> regions = new List<ulong>(avatar.KnownChildRegionHandles);
217 regions.Remove(avatar.Scene.RegionInfo.RegionHandle);
218 SendCloseChildAgentConnections(avatar.UUID, regions);
219 }
220 else // close just a few
221 avatar.CloseChildAgents(newRegionX, newRegionY);
222
223 if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY) || isHyperLink)
224 {
225 capsPath
226 = "http://"
227 + reg.ExternalHostName
228 + ":"
229 + reg.HttpPort
230 + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
231
232 if (eq != null)
233 {
234 #region IP Translation for NAT
235 IClientIPEndpoint ipepClient;
236 if (avatar.ClientView.TryGet(out ipepClient))
237 {
238 endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
239 }
240 #endregion
241
242 eq.EnableSimulator(realHandle, endPoint, avatar.UUID);
243
244 // ES makes the client send a UseCircuitCode message to the destination,
245 // which triggers a bunch of things there.
246 // So let's wait
247 Thread.Sleep(2000);
248
249 eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath);
250 }
251 else
252 {
253 avatar.ControllingClient.InformClientOfNeighbour(realHandle, endPoint);
254 // TODO: make Event Queue disablable!
255 }
256 }
257 else
258 {
259 // child agent already there
260 agentCircuit.CapsPath = avatar.Scene.CapsModule.GetChildSeed(avatar.UUID, reg.RegionHandle);
261 capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort
262 + "/CAPS/" + agentCircuit.CapsPath + "0000/";
263 }
264
265 //m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId,
266 // position, false);
267
268 //if (!m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId,
269 // position, false))
270 //{
271 // avatar.ControllingClient.SendTeleportFailed("Problem with destination.");
272 // // We should close that agent we just created over at destination...
273 // List<ulong> lst = new List<ulong>();
274 // lst.Add(realHandle);
275 // SendCloseChildAgentAsync(avatar.UUID, lst);
276 // return;
277 //}
278
279 SetInTransit(avatar.UUID);
280 // Let's send a full update of the agent. This is a synchronous call.
281 AgentData agent = new AgentData();
282 avatar.CopyTo(agent);
283 agent.Position = position;
284 agent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort +
285 "/agent/" + avatar.UUID.ToString() + "/" + avatar.Scene.RegionInfo.RegionHandle.ToString() + "/release/";
286
287 m_interregionCommsOut.SendChildAgentUpdate(reg.RegionHandle, agent);
288
289 m_log.DebugFormat(
290 "[CAPS]: Sending new CAPS seed url {0} to client {1}", agentCircuit.CapsPath, avatar.UUID);
291
292
293 ///
294 /// Hypergrid mod: realHandle instead of reg.RegionHandle
295 ///
296 ///
297 if (eq != null)
298 {
299 eq.TeleportFinishEvent(realHandle, 13, endPoint,
300 4, teleportFlags, capsPath, avatar.UUID);
301 }
302 else
303 {
304 avatar.ControllingClient.SendRegionTeleport(realHandle, 13, endPoint, 4,
305 teleportFlags, capsPath);
306 }
307 ///
308 /// Hypergrid mod stop
309 ///
310
311
312 // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which
313 // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation
314 // that the client contacted the destination before we send the attachments and close things here.
315 if (!WaitForCallback(avatar.UUID))
316 {
317 // Client never contacted destination. Let's restore everything back
318 avatar.ControllingClient.SendTeleportFailed("Problems connecting to destination.");
319
320 ResetFromTransit(avatar.UUID);
321 // Yikes! We should just have a ref to scene here.
322 avatar.Scene.InformClientOfNeighbours(avatar);
323
324 // Finally, kill the agent we just created at the destination.
325 m_interregionCommsOut.SendCloseAgent(reg.RegionHandle, avatar.UUID);
326
327 return;
328 }
329
330 // Can't go back from here
331 if (KiPrimitive != null)
332 {
333 KiPrimitive(avatar.LocalId);
334 }
335
336 avatar.MakeChildAgent();
337
338 // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it
339 avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true);
340
341
342 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
343 ///
344 /// Hypergrid mod: extra check for isHyperLink
345 ///
346 if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY) || isHyperLink)
347 {
348 Thread.Sleep(5000);
349 avatar.Close();
350 CloseConnection(avatar.UUID);
351 }
352 // if (teleport success) // seems to be always success here
353 // the user may change their profile information in other region,
354 // so the userinfo in UserProfileCache is not reliable any more, delete it
355 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID) || isHyperLink)
356 {
357 m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID);
358 m_log.DebugFormat(
359 "[HGSceneCommService]: User {0} is going to another region, profile cache removed",
360 avatar.UUID);
361 }
362 }
363 else
364 {
365 avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down");
366 }
367 }
368 else
369 {
370 // TP to a place that doesn't exist (anymore)
371 // Inform the viewer about that
372 avatar.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore");
373
374 // and set the map-tile to '(Offline)'
375 uint regX, regY;
376 Utils.LongToUInts(regionHandle, out regX, out regY);
377
378 MapBlockData block = new MapBlockData();
379 block.X = (ushort)(regX / Constants.RegionSize);
380 block.Y = (ushort)(regY / Constants.RegionSize);
381 block.Access = 254; // == not there
382
383 List<MapBlockData> blocks = new List<MapBlockData>();
384 blocks.Add(block);
385 avatar.ControllingClient.SendMapBlock(blocks, 0);
386 }
387 }
388 }
389
390 }
391}
diff --git a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs
index e9660b1..d25d5dd 100644
--- a/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs
+++ b/OpenSim/Region/Framework/Scenes/RegionStatsHandler.cs
@@ -36,8 +36,7 @@ using OpenMetaverse;
36using OpenMetaverse.StructuredData; 36using OpenMetaverse.StructuredData;
37using OpenSim.Framework; 37using OpenSim.Framework;
38using OpenSim.Framework.Communications; 38using OpenSim.Framework.Communications;
39using OpenSim.Framework.Communications.Services; 39
40using OpenSim.Framework.Communications.Cache;
41using OpenSim.Framework.Console; 40using OpenSim.Framework.Console;
42using OpenSim.Framework.Servers; 41using OpenSim.Framework.Servers;
43using OpenSim.Framework.Servers.HttpServer; 42using OpenSim.Framework.Servers.HttpServer;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 3044017..62a831e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -35,7 +35,7 @@ using OpenMetaverse;
35using OpenMetaverse.Packets; 35using OpenMetaverse.Packets;
36using log4net; 36using log4net;
37using OpenSim.Framework; 37using OpenSim.Framework;
38using OpenSim.Framework.Communications.Cache; 38
39using OpenSim.Region.Framework; 39using OpenSim.Region.Framework;
40using OpenSim.Region.Framework.Interfaces; 40using OpenSim.Region.Framework.Interfaces;
41using OpenSim.Region.Framework.Scenes.Serialization; 41using OpenSim.Region.Framework.Scenes.Serialization;
@@ -101,12 +101,6 @@ namespace OpenSim.Region.Framework.Scenes
101 { 101 {
102 userlevel = 1; 102 userlevel = 1;
103 } 103 }
104 // TODO: remove this cruft once MasterAvatar is fully deprecated
105 //
106 if (m_regInfo.MasterAvatarAssignedUUID == AgentID)
107 {
108 userlevel = 2;
109 }
110 EventManager.TriggerOnNewInventoryItemUploadComplete(AgentID, item.AssetID, item.Name, userlevel); 104 EventManager.TriggerOnNewInventoryItemUploadComplete(AgentID, item.AssetID, item.Name, userlevel);
111 } 105 }
112 else 106 else
@@ -573,7 +567,9 @@ namespace OpenSim.Region.Framework.Scenes
573 "[AGENT INVENTORY]: CopyInventoryItem received by {0} with oldAgentID {1}, oldItemID {2}, new FolderID {3}, newName {4}", 567 "[AGENT INVENTORY]: CopyInventoryItem received by {0} with oldAgentID {1}, oldItemID {2}, new FolderID {3}, newName {4}",
574 remoteClient.AgentId, oldAgentID, oldItemID, newFolderID, newName); 568 remoteClient.AgentId, oldAgentID, oldItemID, newFolderID, newName);
575 569
576 InventoryItemBase item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(oldItemID); 570 InventoryItemBase item = null;
571 if (LibraryService != null && LibraryService.LibraryRootFolder != null)
572 item = LibraryService.LibraryRootFolder.FindItem(oldItemID);
577 573
578 if (item == null) 574 if (item == null)
579 { 575 {
@@ -742,13 +738,9 @@ namespace OpenSim.Region.Framework.Scenes
742 738
743 if (transactionID == UUID.Zero) 739 if (transactionID == UUID.Zero)
744 { 740 {
745 CachedUserInfo userInfo 741 ScenePresence presence;
746 = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); 742 if (TryGetAvatar(remoteClient.AgentId, out presence))
747
748 if (userInfo != null)
749 { 743 {
750 ScenePresence presence;
751 TryGetAvatar(remoteClient.AgentId, out presence);
752 byte[] data = null; 744 byte[] data = null;
753 745
754 if (invType == (sbyte)InventoryType.Landmark && presence != null) 746 if (invType == (sbyte)InventoryType.Landmark && presence != null)
@@ -770,7 +762,7 @@ namespace OpenSim.Region.Framework.Scenes
770 else 762 else
771 { 763 {
772 m_log.ErrorFormat( 764 m_log.ErrorFormat(
773 "userInfo for agent uuid {0} unexpectedly null in CreateNewInventoryItem", 765 "ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem",
774 remoteClient.AgentId); 766 remoteClient.AgentId);
775 } 767 }
776 } 768 }
@@ -1161,15 +1153,21 @@ namespace OpenSim.Region.Framework.Scenes
1161 1153
1162 private void SendInventoryUpdate(IClientAPI client, InventoryFolderBase folder, bool fetchFolders, bool fetchItems) 1154 private void SendInventoryUpdate(IClientAPI client, InventoryFolderBase folder, bool fetchFolders, bool fetchItems)
1163 { 1155 {
1156 if (folder == null)
1157 return;
1158
1164 m_log.DebugFormat("[AGENT INVENTORY]: Send Inventory Folder {0} Update to {1} {2}", folder.Name, client.FirstName, client.LastName); 1159 m_log.DebugFormat("[AGENT INVENTORY]: Send Inventory Folder {0} Update to {1} {2}", folder.Name, client.FirstName, client.LastName);
1165 InventoryCollection contents = InventoryService.GetFolderContent(client.AgentId, folder.ID); 1160 InventoryCollection contents = InventoryService.GetFolderContent(client.AgentId, folder.ID);
1166 InventoryFolderBase containingFolder = new InventoryFolderBase(); 1161 InventoryFolderBase containingFolder = new InventoryFolderBase();
1167 containingFolder.ID = folder.ID; 1162 containingFolder.ID = folder.ID;
1168 containingFolder.Owner = client.AgentId; 1163 containingFolder.Owner = client.AgentId;
1169 containingFolder = InventoryService.GetFolder(containingFolder); 1164 containingFolder = InventoryService.GetFolder(containingFolder);
1170 int version = containingFolder.Version; 1165 if (containingFolder != null)
1166 {
1167 int version = containingFolder.Version;
1171 1168
1172 client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, version, fetchFolders, fetchItems); 1169 client.SendInventoryFolderDetails(client.AgentId, folder.ID, contents.Items, contents.Folders, version, fetchFolders, fetchItems);
1170 }
1173 } 1171 }
1174 1172
1175 /// <summary> 1173 /// <summary>
@@ -1211,9 +1209,9 @@ namespace OpenSim.Region.Framework.Scenes
1211 item = InventoryService.GetItem(item); 1209 item = InventoryService.GetItem(item);
1212 1210
1213 // Try library 1211 // Try library
1214 if (null == item) 1212 if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null)
1215 { 1213 {
1216 item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); 1214 item = LibraryService.LibraryRootFolder.FindItem(itemID);
1217 } 1215 }
1218 1216
1219 if (item != null) 1217 if (item != null)
@@ -1280,9 +1278,9 @@ namespace OpenSim.Region.Framework.Scenes
1280 1278
1281 // Try library 1279 // Try library
1282 // XXX clumsy, possibly should be one call 1280 // XXX clumsy, possibly should be one call
1283 if (null == item) 1281 if (null == item && LibraryService != null && LibraryService.LibraryRootFolder != null)
1284 { 1282 {
1285 item = CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID); 1283 item = LibraryService.LibraryRootFolder.FindItem(itemID);
1286 } 1284 }
1287 1285
1288 if (item != null) 1286 if (item != null)
@@ -2405,7 +2403,7 @@ namespace OpenSim.Region.Framework.Scenes
2405 // XXYY!! 2403 // XXYY!!
2406 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 2404 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
2407 item = InventoryService.GetItem(item); 2405 item = InventoryService.GetItem(item);
2408 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); 2406 presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */);
2409 2407
2410 if (m_AvatarFactory != null) 2408 if (m_AvatarFactory != null)
2411 { 2409 {
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index 47fbeb4..342b3c5 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -32,7 +32,7 @@ using OpenMetaverse;
32using OpenMetaverse.Packets; 32using OpenMetaverse.Packets;
33using OpenSim.Framework; 33using OpenSim.Framework;
34using OpenSim.Framework.Communications; 34using OpenSim.Framework.Communications;
35using OpenSim.Framework.Communications.Cache; 35using OpenSim.Services.Interfaces;
36 36
37namespace OpenSim.Region.Framework.Scenes 37namespace OpenSim.Region.Framework.Scenes
38{ 38{
@@ -331,14 +331,16 @@ namespace OpenSim.Region.Framework.Scenes
331 { 331 {
332 //EventManager.TriggerAvatarPickerRequest(); 332 //EventManager.TriggerAvatarPickerRequest();
333 333
334 List<AvatarPickerAvatar> AvatarResponses = new List<AvatarPickerAvatar>(); 334 List<UserAccount> accounts = UserAccountService.GetUserAccounts(RegionInfo.ScopeID, query);
335 AvatarResponses = m_sceneGridService.GenerateAgentPickerRequestResponse(RequestID, query); 335
336 if (accounts == null)
337 return;
336 338
337 AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply); 339 AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply);
338 // TODO: don't create new blocks if recycling an old packet 340 // TODO: don't create new blocks if recycling an old packet
339 341
340 AvatarPickerReplyPacket.DataBlock[] searchData = 342 AvatarPickerReplyPacket.DataBlock[] searchData =
341 new AvatarPickerReplyPacket.DataBlock[AvatarResponses.Count]; 343 new AvatarPickerReplyPacket.DataBlock[accounts.Count];
342 AvatarPickerReplyPacket.AgentDataBlock agentData = new AvatarPickerReplyPacket.AgentDataBlock(); 344 AvatarPickerReplyPacket.AgentDataBlock agentData = new AvatarPickerReplyPacket.AgentDataBlock();
343 345
344 agentData.AgentID = avatarID; 346 agentData.AgentID = avatarID;
@@ -347,16 +349,16 @@ namespace OpenSim.Region.Framework.Scenes
347 //byte[] bytes = new byte[AvatarResponses.Count*32]; 349 //byte[] bytes = new byte[AvatarResponses.Count*32];
348 350
349 int i = 0; 351 int i = 0;
350 foreach (AvatarPickerAvatar item in AvatarResponses) 352 foreach (UserAccount item in accounts)
351 { 353 {
352 UUID translatedIDtem = item.AvatarID; 354 UUID translatedIDtem = item.PrincipalID;
353 searchData[i] = new AvatarPickerReplyPacket.DataBlock(); 355 searchData[i] = new AvatarPickerReplyPacket.DataBlock();
354 searchData[i].AvatarID = translatedIDtem; 356 searchData[i].AvatarID = translatedIDtem;
355 searchData[i].FirstName = Utils.StringToBytes((string) item.firstName); 357 searchData[i].FirstName = Utils.StringToBytes((string) item.FirstName);
356 searchData[i].LastName = Utils.StringToBytes((string) item.lastName); 358 searchData[i].LastName = Utils.StringToBytes((string) item.LastName);
357 i++; 359 i++;
358 } 360 }
359 if (AvatarResponses.Count == 0) 361 if (accounts.Count == 0)
360 { 362 {
361 searchData = new AvatarPickerReplyPacket.DataBlock[0]; 363 searchData = new AvatarPickerReplyPacket.DataBlock[0];
362 } 364 }
@@ -415,7 +417,24 @@ namespace OpenSim.Region.Framework.Scenes
415 } 417 }
416 ); 418 );
417 } 419 }
418 420
421 public void HandleUUIDNameRequest(UUID uuid, IClientAPI remote_client)
422 {
423 if (LibraryService != null && (LibraryService.LibraryRootFolder.Owner == uuid))
424 {
425 remote_client.SendNameReply(uuid, "Mr", "OpenSim");
426 }
427 else
428 {
429 string[] names = GetUserNames(uuid);
430 if (names.Length == 2)
431 {
432 remote_client.SendNameReply(uuid, names[0], names[1]);
433 }
434
435 }
436 }
437
419 /// <summary> 438 /// <summary>
420 /// Handle a fetch inventory request from the client 439 /// Handle a fetch inventory request from the client
421 /// </summary> 440 /// </summary>
@@ -424,7 +443,7 @@ namespace OpenSim.Region.Framework.Scenes
424 /// <param name="ownerID"></param> 443 /// <param name="ownerID"></param>
425 public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID) 444 public void HandleFetchInventory(IClientAPI remoteClient, UUID itemID, UUID ownerID)
426 { 445 {
427 if (ownerID == CommsManager.UserProfileCacheService.LibraryRoot.Owner) 446 if (LibraryService != null && LibraryService.LibraryRootFolder != null && ownerID == LibraryService.LibraryRootFolder.Owner)
428 { 447 {
429 //m_log.Debug("request info for library item"); 448 //m_log.Debug("request info for library item");
430 return; 449 return;
@@ -458,13 +477,14 @@ namespace OpenSim.Region.Framework.Scenes
458 // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc. 477 // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc.
459 // can be handled transparently). 478 // can be handled transparently).
460 InventoryFolderImpl fold = null; 479 InventoryFolderImpl fold = null;
461 if ((fold = CommsManager.UserProfileCacheService.LibraryRoot.FindFolder(folderID)) != null) 480 if (LibraryService != null && LibraryService.LibraryRootFolder != null)
462 { 481 if ((fold = LibraryService.LibraryRootFolder.FindFolder(folderID)) != null)
463 remoteClient.SendInventoryFolderDetails( 482 {
464 fold.Owner, folderID, fold.RequestListOfItems(), 483 remoteClient.SendInventoryFolderDetails(
465 fold.RequestListOfFolders(), fold.Version, fetchFolders, fetchItems); 484 fold.Owner, folderID, fold.RequestListOfItems(),
466 return; 485 fold.RequestListOfFolders(), fold.Version, fetchFolders, fetchItems);
467 } 486 return;
487 }
468 488
469 // We're going to send the reply async, because there may be 489 // We're going to send the reply async, because there may be
470 // an enormous quantity of packets -- basically the entire inventory! 490 // an enormous quantity of packets -- basically the entire inventory!
@@ -512,15 +532,16 @@ namespace OpenSim.Region.Framework.Scenes
512 // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc. 532 // CachedUserInfo so that this class doesn't have to know the details (and so that multiple libraries, etc.
513 // can be handled transparently). 533 // can be handled transparently).
514 InventoryFolderImpl fold; 534 InventoryFolderImpl fold;
515 if ((fold = CommsManager.UserProfileCacheService.LibraryRoot.FindFolder(folderID)) != null) 535 if (LibraryService != null && LibraryService.LibraryRootFolder != null)
516 { 536 if ((fold = LibraryService.LibraryRootFolder.FindFolder(folderID)) != null)
517 version = 0; 537 {
518 InventoryCollection ret = new InventoryCollection(); 538 version = 0;
519 ret.Folders = new List<InventoryFolderBase>(); 539 InventoryCollection ret = new InventoryCollection();
520 ret.Items = fold.RequestListOfItems(); 540 ret.Folders = new List<InventoryFolderBase>();
541 ret.Items = fold.RequestListOfItems();
521 542
522 return ret; 543 return ret;
523 } 544 }
524 545
525 InventoryCollection contents = new InventoryCollection(); 546 InventoryCollection contents = new InventoryCollection();
526 547
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 234554e..bf40d82 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -41,8 +41,7 @@ using OpenMetaverse.Imaging;
41using OpenSim.Framework; 41using OpenSim.Framework;
42using OpenSim.Services.Interfaces; 42using OpenSim.Services.Interfaces;
43using OpenSim.Framework.Communications; 43using OpenSim.Framework.Communications;
44using OpenSim.Framework.Communications.Cache; 44
45using OpenSim.Framework.Communications.Clients;
46using OpenSim.Framework.Console; 45using OpenSim.Framework.Console;
47using OpenSim.Region.Framework.Interfaces; 46using OpenSim.Region.Framework.Interfaces;
48using OpenSim.Region.Framework.Scenes.Scripting; 47using OpenSim.Region.Framework.Scenes.Scripting;
@@ -141,7 +140,6 @@ namespace OpenSim.Region.Framework.Scenes
141 protected ModuleLoader m_moduleLoader; 140 protected ModuleLoader m_moduleLoader;
142 protected StorageManager m_storageManager; 141 protected StorageManager m_storageManager;
143 protected AgentCircuitManager m_authenticateHandler; 142 protected AgentCircuitManager m_authenticateHandler;
144 public CommunicationsManager CommsManager;
145 143
146 protected SceneCommunicationService m_sceneGridService; 144 protected SceneCommunicationService m_sceneGridService;
147 public bool LoginsDisabled = true; 145 public bool LoginsDisabled = true;
@@ -189,11 +187,11 @@ namespace OpenSim.Region.Framework.Scenes
189 { 187 {
190 m_AuthorizationService = RequestModuleInterface<IAuthorizationService>(); 188 m_AuthorizationService = RequestModuleInterface<IAuthorizationService>();
191 189
192 if (m_AuthorizationService == null) 190 //if (m_AuthorizationService == null)
193 { 191 //{
194 // don't throw an exception if no authorization service is set for the time being 192 // // don't throw an exception if no authorization service is set for the time being
195 m_log.InfoFormat("[SCENE]: No Authorization service is configured"); 193 // m_log.InfoFormat("[SCENE]: No Authorization service is configured");
196 } 194 //}
197 } 195 }
198 196
199 return m_AuthorizationService; 197 return m_AuthorizationService;
@@ -240,6 +238,73 @@ namespace OpenSim.Region.Framework.Scenes
240 } 238 }
241 } 239 }
242 240
241 protected ILibraryService m_LibraryService;
242
243 public ILibraryService LibraryService
244 {
245 get
246 {
247 if (m_LibraryService == null)
248 m_LibraryService = RequestModuleInterface<ILibraryService>();
249
250 return m_LibraryService;
251 }
252 }
253
254 protected ISimulationService m_simulationService;
255 public ISimulationService SimulationService
256 {
257 get
258 {
259 if (m_simulationService == null)
260 m_simulationService = RequestModuleInterface<ISimulationService>();
261 return m_simulationService;
262 }
263 }
264
265 protected IAuthenticationService m_AuthenticationService;
266 public IAuthenticationService AuthenticationService
267 {
268 get
269 {
270 if (m_AuthenticationService == null)
271 m_AuthenticationService = RequestModuleInterface<IAuthenticationService>();
272 return m_AuthenticationService;
273 }
274 }
275
276 protected IPresenceService m_PresenceService;
277 public IPresenceService PresenceService
278 {
279 get
280 {
281 if (m_PresenceService == null)
282 m_PresenceService = RequestModuleInterface<IPresenceService>();
283 return m_PresenceService;
284 }
285 }
286 protected IUserAccountService m_UserAccountService;
287 public IUserAccountService UserAccountService
288 {
289 get
290 {
291 if (m_UserAccountService == null)
292 m_UserAccountService = RequestModuleInterface<IUserAccountService>();
293 return m_UserAccountService;
294 }
295 }
296
297 protected OpenSim.Services.Interfaces.IAvatarService m_AvatarService;
298 public OpenSim.Services.Interfaces.IAvatarService AvatarService
299 {
300 get
301 {
302 if (m_AvatarService == null)
303 m_AvatarService = RequestModuleInterface<IAvatarService>();
304 return m_AvatarService;
305 }
306 }
307
243 protected IXMLRPC m_xmlrpcModule; 308 protected IXMLRPC m_xmlrpcModule;
244 protected IWorldComm m_worldCommModule; 309 protected IWorldComm m_worldCommModule;
245 protected IAvatarFactory m_AvatarFactory; 310 protected IAvatarFactory m_AvatarFactory;
@@ -249,10 +314,8 @@ namespace OpenSim.Region.Framework.Scenes
249 } 314 }
250 protected IConfigSource m_config; 315 protected IConfigSource m_config;
251 protected IRegionSerialiserModule m_serialiser; 316 protected IRegionSerialiserModule m_serialiser;
252 protected IInterregionCommsOut m_interregionCommsOut;
253 protected IInterregionCommsIn m_interregionCommsIn;
254 protected IDialogModule m_dialogModule; 317 protected IDialogModule m_dialogModule;
255 protected ITeleportModule m_teleportModule; 318 protected IAgentTransferModule m_teleportModule;
256 319
257 protected ICapabilitiesModule m_capsModule; 320 protected ICapabilitiesModule m_capsModule;
258 public ICapabilitiesModule CapsModule 321 public ICapabilitiesModule CapsModule
@@ -483,7 +546,7 @@ namespace OpenSim.Region.Framework.Scenes
483 #region Constructors 546 #region Constructors
484 547
485 public Scene(RegionInfo regInfo, AgentCircuitManager authen, 548 public Scene(RegionInfo regInfo, AgentCircuitManager authen,
486 CommunicationsManager commsMan, SceneCommunicationService sceneGridService, 549 SceneCommunicationService sceneGridService,
487 StorageManager storeManager, 550 StorageManager storeManager,
488 ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim, 551 ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim,
489 bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion) 552 bool SeeIntoRegionFromNeighbor, IConfigSource config, string simulatorVersion)
@@ -519,7 +582,6 @@ namespace OpenSim.Region.Framework.Scenes
519 m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4); 582 m_lastAllocatedLocalId = (uint)(random.NextDouble() * (double)(uint.MaxValue/2))+(uint)(uint.MaxValue/4);
520 m_moduleLoader = moduleLoader; 583 m_moduleLoader = moduleLoader;
521 m_authenticateHandler = authen; 584 m_authenticateHandler = authen;
522 CommsManager = commsMan;
523 m_sceneGridService = sceneGridService; 585 m_sceneGridService = sceneGridService;
524 m_storageManager = storeManager; 586 m_storageManager = storeManager;
525 m_regInfo = regInfo; 587 m_regInfo = regInfo;
@@ -776,6 +838,36 @@ namespace OpenSim.Region.Framework.Scenes
776 return m_simulatorVersion; 838 return m_simulatorVersion;
777 } 839 }
778 840
841 public string[] GetUserNames(UUID uuid)
842 {
843 string[] returnstring = new string[0];
844
845 UserAccount account = UserAccountService.GetUserAccount(RegionInfo.ScopeID, uuid);
846
847 if (account != null)
848 {
849 returnstring = new string[2];
850 returnstring[0] = account.FirstName;
851 returnstring[1] = account.LastName;
852 }
853
854 return returnstring;
855 }
856
857 public string GetUserName(UUID uuid)
858 {
859 string[] names = GetUserNames(uuid);
860 if (names.Length == 2)
861 {
862 string firstname = names[0];
863 string lastname = names[1];
864
865 return firstname + " " + lastname;
866
867 }
868 return "(hippos)";
869 }
870
779 /// <summary> 871 /// <summary>
780 /// Another region is up. 872 /// Another region is up.
781 /// 873 ///
@@ -809,7 +901,7 @@ namespace OpenSim.Region.Framework.Scenes
809 regInfo.RegionName = otherRegion.RegionName; 901 regInfo.RegionName = otherRegion.RegionName;
810 regInfo.ScopeID = otherRegion.ScopeID; 902 regInfo.ScopeID = otherRegion.ScopeID;
811 regInfo.ExternalHostName = otherRegion.ExternalHostName; 903 regInfo.ExternalHostName = otherRegion.ExternalHostName;
812 904 GridRegion r = new GridRegion(regInfo);
813 try 905 try
814 { 906 {
815 ForEachScenePresence(delegate(ScenePresence agent) 907 ForEachScenePresence(delegate(ScenePresence agent)
@@ -823,7 +915,8 @@ namespace OpenSim.Region.Framework.Scenes
823 List<ulong> old = new List<ulong>(); 915 List<ulong> old = new List<ulong>();
824 old.Add(otherRegion.RegionHandle); 916 old.Add(otherRegion.RegionHandle);
825 agent.DropOldNeighbours(old); 917 agent.DropOldNeighbours(old);
826 InformClientOfNeighbor(agent, regInfo); 918 if (m_teleportModule != null)
919 m_teleportModule.EnableChildAgent(agent, r);
827 } 920 }
828 } 921 }
829 ); 922 );
@@ -971,6 +1064,7 @@ namespace OpenSim.Region.Framework.Scenes
971 { 1064 {
972 foreach (RegionInfo region in m_regionRestartNotifyList) 1065 foreach (RegionInfo region in m_regionRestartNotifyList)
973 { 1066 {
1067 GridRegion r = new GridRegion(region);
974 try 1068 try
975 { 1069 {
976 ForEachScenePresence(delegate(ScenePresence agent) 1070 ForEachScenePresence(delegate(ScenePresence agent)
@@ -978,9 +1072,8 @@ namespace OpenSim.Region.Framework.Scenes
978 // If agent is a root agent. 1072 // If agent is a root agent.
979 if (!agent.IsChildAgent) 1073 if (!agent.IsChildAgent)
980 { 1074 {
981 //agent.ControllingClient.new 1075 if (m_teleportModule != null)
982 //this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo()); 1076 m_teleportModule.EnableChildAgent(agent, r);
983 InformClientOfNeighbor(agent, region);
984 } 1077 }
985 } 1078 }
986 ); 1079 );
@@ -1123,11 +1216,9 @@ namespace OpenSim.Region.Framework.Scenes
1123 XferManager = RequestModuleInterface<IXfer>(); 1216 XferManager = RequestModuleInterface<IXfer>();
1124 m_AvatarFactory = RequestModuleInterface<IAvatarFactory>(); 1217 m_AvatarFactory = RequestModuleInterface<IAvatarFactory>();
1125 m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); 1218 m_serialiser = RequestModuleInterface<IRegionSerialiserModule>();
1126 m_interregionCommsOut = RequestModuleInterface<IInterregionCommsOut>();
1127 m_interregionCommsIn = RequestModuleInterface<IInterregionCommsIn>();
1128 m_dialogModule = RequestModuleInterface<IDialogModule>(); 1219 m_dialogModule = RequestModuleInterface<IDialogModule>();
1129 m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); 1220 m_capsModule = RequestModuleInterface<ICapabilitiesModule>();
1130 m_teleportModule = RequestModuleInterface<ITeleportModule>(); 1221 m_teleportModule = RequestModuleInterface<IAgentTransferModule>();
1131 } 1222 }
1132 1223
1133 #endregion 1224 #endregion
@@ -2146,7 +2237,10 @@ namespace OpenSim.Region.Framework.Scenes
2146 grp.OffsetForNewRegion(pos); 2237 grp.OffsetForNewRegion(pos);
2147 2238
2148 // If we fail to cross the border, then reset the position of the scene object on that border. 2239 // If we fail to cross the border, then reset the position of the scene object on that border.
2149 if (!CrossPrimGroupIntoNewRegion(newRegionHandle, grp, silent)) 2240 uint x = 0, y = 0;
2241 Utils.LongToUInts(newRegionHandle, out x, out y);
2242 GridRegion destination = GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
2243 if (destination != null && !CrossPrimGroupIntoNewRegion(destination, grp, silent))
2150 { 2244 {
2151 grp.OffsetForNewRegion(oldGroupPosition); 2245 grp.OffsetForNewRegion(oldGroupPosition);
2152 grp.ScheduleGroupForFullUpdate(); 2246 grp.ScheduleGroupForFullUpdate();
@@ -2342,7 +2436,7 @@ namespace OpenSim.Region.Framework.Scenes
2342 /// true if the crossing itself was successful, false on failure 2436 /// true if the crossing itself was successful, false on failure
2343 /// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region 2437 /// FIMXE: we still return true if the crossing object was not successfully deleted from the originating region
2344 /// </returns> 2438 /// </returns>
2345 public bool CrossPrimGroupIntoNewRegion(ulong newRegionHandle, SceneObjectGroup grp, bool silent) 2439 public bool CrossPrimGroupIntoNewRegion(GridRegion destination, SceneObjectGroup grp, bool silent)
2346 { 2440 {
2347 //m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<"); 2441 //m_log.Debug(" >>> CrossPrimGroupIntoNewRegion <<<");
2348 2442
@@ -2350,7 +2444,7 @@ namespace OpenSim.Region.Framework.Scenes
2350 grp.RootPart.UpdateFlag = 0; 2444 grp.RootPart.UpdateFlag = 0;
2351 //int primcrossingXMLmethod = 0; 2445 //int primcrossingXMLmethod = 0;
2352 2446
2353 if (newRegionHandle != 0) 2447 if (destination != null)
2354 { 2448 {
2355 //string objectState = grp.GetStateSnapshot(); 2449 //string objectState = grp.GetStateSnapshot();
2356 2450
@@ -2363,9 +2457,11 @@ namespace OpenSim.Region.Framework.Scenes
2363 // newRegionHandle, grp.UUID, objectState, 100); 2457 // newRegionHandle, grp.UUID, objectState, 100);
2364 //} 2458 //}
2365 2459
2366 // And the new channel... 2460 //// And the new channel...
2367 if (m_interregionCommsOut != null) 2461 //if (m_interregionCommsOut != null)
2368 successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true); 2462 // successYN = m_interregionCommsOut.SendCreateObject(newRegionHandle, grp, true);
2463 if (m_simulationService != null)
2464 successYN = m_simulationService.CreateObject(destination, grp, true);
2369 2465
2370 if (successYN) 2466 if (successYN)
2371 { 2467 {
@@ -2396,7 +2492,7 @@ namespace OpenSim.Region.Framework.Scenes
2396 } 2492 }
2397 else 2493 else
2398 { 2494 {
2399 m_log.Error("[INTERREGION]: region handle was unexpectedly 0 in Scene.CrossPrimGroupIntoNewRegion()"); 2495 m_log.Error("[INTERREGION]: destination was unexpectedly null in Scene.CrossPrimGroupIntoNewRegion()");
2400 } 2496 }
2401 2497
2402 return successYN; 2498 return successYN;
@@ -2462,6 +2558,9 @@ namespace OpenSim.Region.Framework.Scenes
2462 2558
2463 return false; 2559 return false;
2464 } 2560 }
2561
2562 sceneObject.SetScene(this);
2563
2465 // Force allocation of new LocalId 2564 // Force allocation of new LocalId
2466 // 2565 //
2467 foreach (SceneObjectPart p in sceneObject.Children.Values) 2566 foreach (SceneObjectPart p in sceneObject.Children.Values)
@@ -2589,9 +2688,10 @@ namespace OpenSim.Region.Framework.Scenes
2589 m_log.Debug(logMsg); 2688 m_log.Debug(logMsg);
2590 */ 2689 */
2591 2690
2592 CommsManager.UserProfileCacheService.AddNewUser(client.AgentId); 2691 //CommsManager.UserProfileCacheService.AddNewUser(client.AgentId);
2593 2692
2594 ScenePresence sp = CreateAndAddScenePresence(client); 2693 ScenePresence sp = CreateAndAddScenePresence(client);
2694 sp.Appearance = aCircuit.Appearance;
2595 2695
2596 // HERE!!! Do the initial attachments right here 2696 // HERE!!! Do the initial attachments right here
2597 // first agent upon login is a root agent by design. 2697 // first agent upon login is a root agent by design.
@@ -2605,6 +2705,7 @@ namespace OpenSim.Region.Framework.Scenes
2605 2705
2606 m_LastLogin = Util.EnvironmentTickCount(); 2706 m_LastLogin = Util.EnvironmentTickCount();
2607 EventManager.TriggerOnNewClient(client); 2707 EventManager.TriggerOnNewClient(client);
2708
2608 } 2709 }
2609 2710
2610 2711
@@ -2740,7 +2841,7 @@ namespace OpenSim.Region.Framework.Scenes
2740 2841
2741 public virtual void SubscribeToClientGridEvents(IClientAPI client) 2842 public virtual void SubscribeToClientGridEvents(IClientAPI client)
2742 { 2843 {
2743 client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest; 2844 client.OnNameFromUUIDRequest += HandleUUIDNameRequest;
2744 client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; 2845 client.OnMoneyTransferRequest += ProcessMoneyTransferRequest;
2745 client.OnAvatarPickerRequest += ProcessAvatarPickerRequest; 2846 client.OnAvatarPickerRequest += ProcessAvatarPickerRequest;
2746 client.OnSetStartLocationRequest += SetHomeRezPoint; 2847 client.OnSetStartLocationRequest += SetHomeRezPoint;
@@ -2895,7 +2996,7 @@ namespace OpenSim.Region.Framework.Scenes
2895 2996
2896 public virtual void UnSubscribeToClientGridEvents(IClientAPI client) 2997 public virtual void UnSubscribeToClientGridEvents(IClientAPI client)
2897 { 2998 {
2898 client.OnNameFromUUIDRequest -= CommsManager.HandleUUIDNameRequest; 2999 client.OnNameFromUUIDRequest -= HandleUUIDNameRequest;
2899 client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest; 3000 client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest;
2900 client.OnAvatarPickerRequest -= ProcessAvatarPickerRequest; 3001 client.OnAvatarPickerRequest -= ProcessAvatarPickerRequest;
2901 client.OnSetStartLocationRequest -= SetHomeRezPoint; 3002 client.OnSetStartLocationRequest -= SetHomeRezPoint;
@@ -2922,21 +3023,11 @@ namespace OpenSim.Region.Framework.Scenes
2922 /// <param name="client">The IClientAPI for the client</param> 3023 /// <param name="client">The IClientAPI for the client</param>
2923 public virtual void TeleportClientHome(UUID agentId, IClientAPI client) 3024 public virtual void TeleportClientHome(UUID agentId, IClientAPI client)
2924 { 3025 {
2925 UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(agentId); 3026 OpenSim.Services.Interfaces.PresenceInfo pinfo = PresenceService.GetAgent(client.SessionId);
2926 if (UserProfile != null) 3027
3028 if (pinfo != null)
2927 { 3029 {
2928 GridRegion regionInfo = GridService.GetRegionByUUID(UUID.Zero, UserProfile.HomeRegionID); 3030 GridRegion regionInfo = GridService.GetRegionByUUID(UUID.Zero, pinfo.HomeRegionID);
2929 if (regionInfo == null)
2930 {
2931 uint x = 0, y = 0;
2932 Utils.LongToUInts(UserProfile.HomeRegion, out x, out y);
2933 regionInfo = GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
2934 if (regionInfo != null) // home region can be away temporarily, too
2935 {
2936 UserProfile.HomeRegionID = regionInfo.RegionID;
2937 CommsManager.UserService.UpdateUserProfile(UserProfile);
2938 }
2939 }
2940 if (regionInfo == null) 3031 if (regionInfo == null)
2941 { 3032 {
2942 // can't find the Home region: Tell viewer and abort 3033 // can't find the Home region: Tell viewer and abort
@@ -2944,7 +3035,7 @@ namespace OpenSim.Region.Framework.Scenes
2944 return; 3035 return;
2945 } 3036 }
2946 RequestTeleportLocation( 3037 RequestTeleportLocation(
2947 client, regionInfo.RegionHandle, UserProfile.HomeLocation, UserProfile.HomeLookAt, 3038 client, regionInfo.RegionHandle, pinfo.HomePosition, pinfo.HomeLookAt,
2948 (uint)(TPFlags.SetLastToTarget | TPFlags.ViaHome)); 3039 (uint)(TPFlags.SetLastToTarget | TPFlags.ViaHome));
2949 } 3040 }
2950 } 3041 }
@@ -3036,7 +3127,7 @@ namespace OpenSim.Region.Framework.Scenes
3036 } 3127 }
3037 3128
3038 /// <summary> 3129 /// <summary>
3039 /// Sets the Home Point. The GridService uses this to know where to put a user when they log-in 3130 /// Sets the Home Point. The LoginService uses this to know where to put a user when they log-in
3040 /// </summary> 3131 /// </summary>
3041 /// <param name="remoteClient"></param> 3132 /// <param name="remoteClient"></param>
3042 /// <param name="regionHandle"></param> 3133 /// <param name="regionHandle"></param>
@@ -3045,27 +3136,11 @@ namespace OpenSim.Region.Framework.Scenes
3045 /// <param name="flags"></param> 3136 /// <param name="flags"></param>
3046 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags) 3137 public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
3047 { 3138 {
3048 UserProfileData UserProfile = CommsManager.UserService.GetUserProfile(remoteClient.AgentId); 3139 if (PresenceService.SetHomeLocation(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt))
3049 if (UserProfile != null)
3050 {
3051 // I know I'm ignoring the regionHandle provided by the teleport location request.
3052 // reusing the TeleportLocationRequest delegate, so regionHandle isn't valid
3053 UserProfile.HomeRegionID = RegionInfo.RegionID;
3054 // TODO: The next line can be removed, as soon as only homeRegionID based UserServers are around.
3055 // TODO: The HomeRegion property can be removed then, too
3056 UserProfile.HomeRegion = RegionInfo.RegionHandle;
3057
3058 UserProfile.HomeLocation = position;
3059 UserProfile.HomeLookAt = lookAt;
3060 CommsManager.UserService.UpdateUserProfile(UserProfile);
3061
3062 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot. 3140 // FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
3063 m_dialogModule.SendAlertToUser(remoteClient, "Home position set."); 3141 m_dialogModule.SendAlertToUser(remoteClient, "Home position set.");
3064 }
3065 else 3142 else
3066 {
3067 m_dialogModule.SendAlertToUser(remoteClient, "Set Home request Failed."); 3143 m_dialogModule.SendAlertToUser(remoteClient, "Set Home request Failed.");
3068 }
3069 } 3144 }
3070 3145
3071 /// <summary> 3146 /// <summary>
@@ -3139,14 +3214,12 @@ namespace OpenSim.Region.Framework.Scenes
3139 m_sceneGraph.removeUserCount(!childagentYN); 3214 m_sceneGraph.removeUserCount(!childagentYN);
3140 CapsModule.RemoveCapsHandler(agentID); 3215 CapsModule.RemoveCapsHandler(agentID);
3141 3216
3142 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID)) 3217 // REFACTORING PROBLEM -- well not really a problem, but just to point out that whatever
3143 { 3218 // this method is doing is HORRIBLE!!!
3144 CommsManager.UserProfileCacheService.RemoveUser(agentID); 3219 avatar.Scene.NeedSceneCacheClear(avatar.UUID);
3145 }
3146 3220
3147 if (!avatar.IsChildAgent) 3221 if (!avatar.IsChildAgent)
3148 { 3222 {
3149 m_sceneGridService.LogOffUser(agentID, RegionInfo.RegionID, RegionInfo.RegionHandle, avatar.AbsolutePosition, avatar.Lookat);
3150 //List<ulong> childknownRegions = new List<ulong>(); 3223 //List<ulong> childknownRegions = new List<ulong>();
3151 //List<ulong> ckn = avatar.KnownChildRegionHandles; 3224 //List<ulong> ckn = avatar.KnownChildRegionHandles;
3152 //for (int i = 0; i < ckn.Count; i++) 3225 //for (int i = 0; i < ckn.Count; i++)
@@ -3201,12 +3274,6 @@ namespace OpenSim.Region.Framework.Scenes
3201 m_log.Error("[SCENE] Scene.cs:RemoveClient exception: " + e.ToString()); 3274 m_log.Error("[SCENE] Scene.cs:RemoveClient exception: " + e.ToString());
3202 } 3275 }
3203 3276
3204 // Remove client agent from profile, so new logins will work
3205 if (!childagentYN)
3206 {
3207 m_sceneGridService.ClearUserAgent(agentID);
3208 }
3209
3210 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode); 3277 m_authenticateHandler.RemoveCircuit(avatar.ControllingClient.CircuitCode);
3211 3278
3212 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false)); 3279 //m_log.InfoFormat("[SCENE] Memory pre GC {0}", System.GC.GetTotalMemory(false));
@@ -3280,14 +3347,6 @@ namespace OpenSim.Region.Framework.Scenes
3280 m_sceneGridService.KiPrimitive += SendKillObject; 3347 m_sceneGridService.KiPrimitive += SendKillObject;
3281 m_sceneGridService.OnGetLandData += GetLandData; 3348 m_sceneGridService.OnGetLandData += GetLandData;
3282 3349
3283 if (m_interregionCommsIn != null)
3284 {
3285 m_log.Debug("[SCENE]: Registering with InterregionCommsIn");
3286 m_interregionCommsIn.OnChildAgentUpdate += IncomingChildAgentDataUpdate;
3287 }
3288 else
3289 m_log.Debug("[SCENE]: Unable to register with InterregionCommsIn");
3290
3291 } 3350 }
3292 3351
3293 /// <summary> 3352 /// <summary>
@@ -3305,9 +3364,6 @@ namespace OpenSim.Region.Framework.Scenes
3305 m_sceneGridService.OnCloseAgentConnection -= IncomingCloseAgent; 3364 m_sceneGridService.OnCloseAgentConnection -= IncomingCloseAgent;
3306 m_sceneGridService.OnGetLandData -= GetLandData; 3365 m_sceneGridService.OnGetLandData -= GetLandData;
3307 3366
3308 if (m_interregionCommsIn != null)
3309 m_interregionCommsIn.OnChildAgentUpdate -= IncomingChildAgentDataUpdate;
3310
3311 // this does nothing; should be removed 3367 // this does nothing; should be removed
3312 m_sceneGridService.Close(); 3368 m_sceneGridService.Close();
3313 3369
@@ -3461,18 +3517,6 @@ namespace OpenSim.Region.Framework.Scenes
3461 3517
3462 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent); 3518 m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
3463 3519
3464 // rewrite session_id
3465 CachedUserInfo userinfo = CommsManager.UserProfileCacheService.GetUserDetails(agent.AgentID);
3466 if (userinfo != null)
3467 {
3468 userinfo.SessionID = agent.SessionID;
3469 }
3470 else
3471 {
3472 m_log.WarnFormat(
3473 "[CONNECTION BEGIN]: We couldn't find a User Info record for {0}. This is usually an indication that the UUID we're looking up is invalid", agent.AgentID);
3474 }
3475
3476 return true; 3520 return true;
3477 } 3521 }
3478 3522
@@ -3487,10 +3531,18 @@ namespace OpenSim.Region.Framework.Scenes
3487 { 3531 {
3488 reason = String.Empty; 3532 reason = String.Empty;
3489 3533
3490 bool result = CommsManager.UserService.VerifySession(agent.AgentID, agent.SessionID); 3534 IAuthenticationService auth = RequestModuleInterface<IAuthenticationService>();
3491 m_log.Debug("[CONNECTION BEGIN]: User authentication returned " + result); 3535 if (auth == null)
3536 {
3537 reason = String.Format("Failed to authenticate user {0} {1} in region {2}. Authentication service does not exist.", agent.firstname, agent.lastname, RegionInfo.RegionName);
3538 return false;
3539 }
3540
3541 bool result = auth.Verify(agent.AgentID, agent.SecureSessionID.ToString(), 30);
3542
3543 m_log.Debug("[CONNECTION BEGIN]: Session authentication returned " + result);
3492 if (!result) 3544 if (!result)
3493 reason = String.Format("Failed to authenticate user {0} {1}, access denied.", agent.firstname, agent.lastname); 3545 reason = String.Format("Failed to authenticate user {0} {1}, access denied to region {2}.", agent.firstname, agent.lastname, RegionInfo.RegionName);
3494 3546
3495 return result; 3547 return result;
3496 } 3548 }
@@ -3693,8 +3745,8 @@ namespace OpenSim.Region.Framework.Scenes
3693 /// <returns>true if we handled it.</returns> 3745 /// <returns>true if we handled it.</returns>
3694 public virtual bool IncomingChildAgentDataUpdate(AgentData cAgentData) 3746 public virtual bool IncomingChildAgentDataUpdate(AgentData cAgentData)
3695 { 3747 {
3696// m_log.DebugFormat( 3748 m_log.DebugFormat(
3697// "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); 3749 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName);
3698 3750
3699 // We have to wait until the viewer contacts this region after receiving EAC. 3751 // We have to wait until the viewer contacts this region after receiving EAC.
3700 // That calls AddNewClient, which finally creates the ScenePresence 3752 // That calls AddNewClient, which finally creates the ScenePresence
@@ -3763,16 +3815,6 @@ namespace OpenSim.Region.Framework.Scenes
3763 return false; 3815 return false;
3764 } 3816 }
3765 3817
3766 public virtual bool IncomingReleaseAgent(UUID id)
3767 {
3768 return m_sceneGridService.ReleaseAgent(id);
3769 }
3770
3771 public void SendReleaseAgent(ulong regionHandle, UUID id, string uri)
3772 {
3773 m_interregionCommsOut.SendReleaseAgent(regionHandle, id, uri);
3774 }
3775
3776 /// <summary> 3818 /// <summary>
3777 /// Tell a single agent to disconnect from the region. 3819 /// Tell a single agent to disconnect from the region.
3778 /// </summary> 3820 /// </summary>
@@ -3817,30 +3859,6 @@ namespace OpenSim.Region.Framework.Scenes
3817 } 3859 }
3818 3860
3819 /// <summary> 3861 /// <summary>
3820 /// Tell neighboring regions about this agent
3821 /// When the regions respond with a true value,
3822 /// tell the agents about the region.
3823 ///
3824 /// We have to tell the regions about the agents first otherwise it'll deny them access
3825 ///
3826 /// </summary>
3827 /// <param name="presence"></param>
3828 public void InformClientOfNeighbours(ScenePresence presence)
3829 {
3830 m_sceneGridService.EnableNeighbourChildAgents(presence, m_neighbours);
3831 }
3832
3833 /// <summary>
3834 /// Tell a neighboring region about this agent
3835 /// </summary>
3836 /// <param name="presence"></param>
3837 /// <param name="region"></param>
3838 public void InformClientOfNeighbor(ScenePresence presence, RegionInfo region)
3839 {
3840 m_sceneGridService.EnableNeighbourChildAgents(presence, m_neighbours);
3841 }
3842
3843 /// <summary>
3844 /// Tries to teleport agent to other region. 3862 /// Tries to teleport agent to other region.
3845 /// </summary> 3863 /// </summary>
3846 /// <param name="remoteClient"></param> 3864 /// <param name="remoteClient"></param>
@@ -3915,16 +3933,12 @@ namespace OpenSim.Region.Framework.Scenes
3915 } 3933 }
3916 3934
3917 if (m_teleportModule != null) 3935 if (m_teleportModule != null)
3918 { 3936 m_teleportModule.Teleport(sp, regionHandle, position, lookAt, teleportFlags);
3919 m_teleportModule.RequestTeleportToLocation(sp, regionHandle,
3920 position, lookAt, teleportFlags);
3921 }
3922 else 3937 else
3923 { 3938 {
3924 m_sceneGridService.RequestTeleportToLocation(sp, regionHandle, 3939 m_log.DebugFormat("[SCENE]: Unable to perform teleports: no AgentTransferModule is active");
3925 position, lookAt, teleportFlags); 3940 sp.ControllingClient.SendTeleportFailed("Unable to perform teleports on this simulator.");
3926 } 3941 }
3927
3928 } 3942 }
3929 } 3943 }
3930 3944
@@ -3950,7 +3964,12 @@ namespace OpenSim.Region.Framework.Scenes
3950 3964
3951 public void CrossAgentToNewRegion(ScenePresence agent, bool isFlying) 3965 public void CrossAgentToNewRegion(ScenePresence agent, bool isFlying)
3952 { 3966 {
3953 m_sceneGridService.CrossAgentToNewRegion(this, agent, isFlying); 3967 if (m_teleportModule != null)
3968 m_teleportModule.Cross(agent, isFlying);
3969 else
3970 {
3971 m_log.DebugFormat("[SCENE]: Unable to cross agent to neighbouring region, because there is no AgentTransferModule");
3972 }
3954 } 3973 }
3955 3974
3956 public void SendOutChildAgentUpdates(AgentPosition cadu, ScenePresence presence) 3975 public void SendOutChildAgentUpdates(AgentPosition cadu, ScenePresence presence)
@@ -3976,35 +3995,6 @@ namespace OpenSim.Region.Framework.Scenes
3976 objectCapacity = objects; 3995 objectCapacity = objects;
3977 } 3996 }
3978 3997
3979 public List<FriendListItem> GetFriendList(string id)
3980 {
3981 UUID avatarID;
3982 if (!UUID.TryParse(id, out avatarID))
3983 return new List<FriendListItem>();
3984
3985 return CommsManager.GetUserFriendList(avatarID);
3986 }
3987
3988 public Dictionary<UUID, FriendRegionInfo> GetFriendRegionInfos(List<UUID> uuids)
3989 {
3990 return CommsManager.GetFriendRegionInfos(uuids);
3991 }
3992
3993 public virtual void StoreAddFriendship(UUID ownerID, UUID friendID, uint perms)
3994 {
3995 m_sceneGridService.AddNewUserFriend(ownerID, friendID, perms);
3996 }
3997
3998 public virtual void StoreUpdateFriendship(UUID ownerID, UUID friendID, uint perms)
3999 {
4000 m_sceneGridService.UpdateUserFriendPerms(ownerID, friendID, perms);
4001 }
4002
4003 public virtual void StoreRemoveFriendship(UUID ownerID, UUID ExfriendID)
4004 {
4005 m_sceneGridService.RemoveUserFriend(ownerID, ExfriendID);
4006 }
4007
4008 #endregion 3998 #endregion
4009 3999
4010 public void HandleObjectPermissionsUpdate(IClientAPI controller, UUID agentID, UUID sessionID, byte field, uint localId, uint mask, byte set) 4000 public void HandleObjectPermissionsUpdate(IClientAPI controller, UUID agentID, UUID sessionID, byte field, uint localId, uint mask, byte set)
@@ -4920,5 +4910,15 @@ namespace OpenSim.Region.Framework.Scenes
4920 if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 2000) 4910 if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 2000)
4921 StartTimer(); 4911 StartTimer();
4922 } 4912 }
4913
4914 public override ISceneObject DeserializeObject(string representation)
4915 {
4916 return SceneObjectSerializer.FromXml2Format(representation);
4917 }
4918
4919 public override bool AllowScriptCrossings
4920 {
4921 get { return m_allowScriptCrossings; }
4922 }
4923 } 4923 }
4924} 4924}
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index 1547f9a..aed8640 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -34,7 +34,7 @@ using log4net;
34using Nini.Config; 34using Nini.Config;
35using OpenSim.Framework; 35using OpenSim.Framework;
36using OpenSim.Framework.Console; 36using OpenSim.Framework.Console;
37using OpenSim.Framework.Communications.Cache; 37
38using OpenSim.Region.Framework.Interfaces; 38using OpenSim.Region.Framework.Interfaces;
39using GridRegion = OpenSim.Services.Interfaces.GridRegion; 39using GridRegion = OpenSim.Services.Interfaces.GridRegion;
40 40
@@ -510,5 +510,16 @@ namespace OpenSim.Region.Framework.Scenes
510 510
511 MainConsole.Instance.Commands.AddCommand(modulename, shared, command, shorthelp, longhelp, callback); 511 MainConsole.Instance.Commands.AddCommand(modulename, shared, command, shorthelp, longhelp, callback);
512 } 512 }
513
514 public virtual ISceneObject DeserializeObject(string representation)
515 {
516 return null;
517 }
518
519 public virtual bool AllowScriptCrossings
520 {
521 get { return false; }
522 }
523
513 } 524 }
514} 525}
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 6164368..f1813a5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -36,7 +36,6 @@ using log4net;
36using OpenSim.Framework; 36using OpenSim.Framework;
37using OpenSim.Framework.Client; 37using OpenSim.Framework.Client;
38using OpenSim.Framework.Communications; 38using OpenSim.Framework.Communications;
39using OpenSim.Framework.Communications.Cache;
40using OpenSim.Framework.Capabilities; 39using OpenSim.Framework.Capabilities;
41using OpenSim.Region.Framework.Interfaces; 40using OpenSim.Region.Framework.Interfaces;
42using OpenSim.Services.Interfaces; 41using OpenSim.Services.Interfaces;
@@ -56,8 +55,6 @@ namespace OpenSim.Region.Framework.Scenes
56 { 55 {
57 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 56 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
58 57
59 protected CommunicationsManager m_commsProvider;
60 protected IInterregionCommsOut m_interregionCommsOut;
61 protected RegionInfo m_regionInfo; 58 protected RegionInfo m_regionInfo;
62 protected Scene m_scene; 59 protected Scene m_scene;
63 60
@@ -118,17 +115,14 @@ namespace OpenSim.Region.Framework.Scenes
118 115
119 public KiPrimitiveDelegate KiPrimitive; 116 public KiPrimitiveDelegate KiPrimitive;
120 117
121 public SceneCommunicationService(CommunicationsManager commsMan) 118 public SceneCommunicationService()
122 { 119 {
123 m_commsProvider = commsMan;
124 m_agentsInTransit = new List<UUID>();
125 } 120 }
126 121
127 public void SetScene(Scene s) 122 public void SetScene(Scene s)
128 { 123 {
129 m_scene = s; 124 m_scene = s;
130 m_regionInfo = s.RegionInfo; 125 m_regionInfo = s.RegionInfo;
131 m_interregionCommsOut = m_scene.RequestModuleInterface<IInterregionCommsOut>();
132 } 126 }
133 127
134 /// <summary> 128 /// <summary>
@@ -148,378 +142,6 @@ namespace OpenSim.Region.Framework.Scenes
148 { 142 {
149 } 143 }
150 144
151 #region CommsManager Event handlers
152
153 /// <summary>
154 /// A New User will arrive shortly, Informs the scene that there's a new user on the way
155 /// </summary>
156 /// <param name="agent">Data we need to ensure that the agent can connect</param>
157 ///
158 protected void NewUserConnection(AgentCircuitData agent)
159 {
160 handlerExpectUser = OnExpectUser;
161 if (handlerExpectUser != null)
162 {
163 //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname);
164 handlerExpectUser(agent);
165 }
166 }
167
168 /// <summary>
169 /// The Grid has requested us to log-off the user
170 /// </summary>
171 /// <param name="AgentID">Unique ID of agent to log-off</param>
172 /// <param name="RegionSecret">The secret string that the region establishes with the grid when registering</param>
173 /// <param name="message">The message to send to the user that tells them why they were logged off</param>
174 protected void GridLogOffUser(UUID AgentID, UUID RegionSecret, string message)
175 {
176 handlerLogOffUser = OnLogOffUser;
177 if (handlerLogOffUser != null)
178 {
179 handlerLogOffUser(AgentID, RegionSecret, message);
180 }
181 }
182
183 /// <summary>
184 /// Inform the scene that we've got an update about a child agent that we have
185 /// </summary>
186 /// <param name="cAgentData"></param>
187 /// <returns></returns>
188 protected bool ChildAgentUpdate(ChildAgentDataUpdate cAgentData)
189 {
190 handlerChildAgentUpdate = OnChildAgentUpdate;
191 if (handlerChildAgentUpdate != null)
192 handlerChildAgentUpdate(cAgentData);
193
194
195 return true;
196 }
197
198
199 protected void AgentCrossing(UUID agentID, Vector3 position, bool isFlying)
200 {
201 handlerAvatarCrossingIntoRegion = OnAvatarCrossingIntoRegion;
202 if (handlerAvatarCrossingIntoRegion != null)
203 {
204 handlerAvatarCrossingIntoRegion(agentID, position, isFlying);
205 }
206 }
207
208 protected void PrimCrossing(UUID primID, Vector3 position, bool isPhysical)
209 {
210 handlerPrimCrossingIntoRegion = OnPrimCrossingIntoRegion;
211 if (handlerPrimCrossingIntoRegion != null)
212 {
213 handlerPrimCrossingIntoRegion(primID, position, isPhysical);
214 }
215 }
216
217 protected bool CloseConnection(UUID agentID)
218 {
219 m_log.Debug("[INTERREGION]: Incoming Agent Close Request for agent: " + agentID);
220
221 handlerCloseAgentConnection = OnCloseAgentConnection;
222 if (handlerCloseAgentConnection != null)
223 {
224 return handlerCloseAgentConnection(agentID);
225 }
226
227 return false;
228 }
229
230 protected LandData FetchLandData(uint x, uint y)
231 {
232 handlerGetLandData = OnGetLandData;
233 if (handlerGetLandData != null)
234 {
235 return handlerGetLandData(x, y);
236 }
237 return null;
238 }
239
240 #endregion
241
242 #region Inform Client of Neighbours
243
244 private delegate void InformClientOfNeighbourDelegate(
245 ScenePresence avatar, AgentCircuitData a, GridRegion reg, IPEndPoint endPoint, bool newAgent);
246
247 private void InformClientOfNeighbourCompleted(IAsyncResult iar)
248 {
249 InformClientOfNeighbourDelegate icon = (InformClientOfNeighbourDelegate) iar.AsyncState;
250 icon.EndInvoke(iar);
251 }
252
253 /// <summary>
254 /// Async component for informing client of which neighbours exist
255 /// </summary>
256 /// <remarks>
257 /// This needs to run asynchronously, as a network timeout may block the thread for a long while
258 /// </remarks>
259 /// <param name="remoteClient"></param>
260 /// <param name="a"></param>
261 /// <param name="regionHandle"></param>
262 /// <param name="endPoint"></param>
263 private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, GridRegion reg,
264 IPEndPoint endPoint, bool newAgent)
265 {
266 // Let's wait just a little to give time to originating regions to catch up with closing child agents
267 // after a cross here
268 Thread.Sleep(500);
269
270 uint x, y;
271 Utils.LongToUInts(reg.RegionHandle, out x, out y);
272 x = x / Constants.RegionSize;
273 y = y / Constants.RegionSize;
274 m_log.Info("[INTERGRID]: Starting to inform client about neighbour " + x + ", " + y + "(" + endPoint.ToString() + ")");
275
276 string capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort
277 + "/CAPS/" + a.CapsPath + "0000/";
278
279 string reason = String.Empty;
280
281
282 bool regionAccepted = m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, 0, out reason);
283
284 if (regionAccepted && newAgent)
285 {
286 IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>();
287 if (eq != null)
288 {
289 #region IP Translation for NAT
290 IClientIPEndpoint ipepClient;
291 if (avatar.ClientView.TryGet(out ipepClient))
292 {
293 endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
294 }
295 #endregion
296
297 eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID);
298 eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath);
299 m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}",
300 capsPath, avatar.UUID, avatar.Scene.RegionInfo.RegionName);
301 }
302 else
303 {
304 avatar.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint);
305 // TODO: make Event Queue disablable!
306 }
307
308 m_log.Info("[INTERGRID]: Completed inform client about neighbour " + endPoint.ToString());
309
310 }
311
312 }
313
314 public List<GridRegion> RequestNeighbours(Scene pScene, uint pRegionLocX, uint pRegionLocY)
315 {
316 Border[] northBorders = pScene.NorthBorders.ToArray();
317 Border[] southBorders = pScene.SouthBorders.ToArray();
318 Border[] eastBorders = pScene.EastBorders.ToArray();
319 Border[] westBorders = pScene.WestBorders.ToArray();
320
321 // Legacy one region. Provided for simplicity while testing the all inclusive method in the else statement.
322 if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1)
323 {
324 return m_scene.GridService.GetNeighbours(m_regionInfo.ScopeID, m_regionInfo.RegionID);
325 }
326 else
327 {
328 Vector2 extent = Vector2.Zero;
329 for (int i = 0; i < eastBorders.Length; i++)
330 {
331 extent.X = (eastBorders[i].BorderLine.Z > extent.X) ? eastBorders[i].BorderLine.Z : extent.X;
332 }
333 for (int i = 0; i < northBorders.Length; i++)
334 {
335 extent.Y = (northBorders[i].BorderLine.Z > extent.Y) ? northBorders[i].BorderLine.Z : extent.Y;
336 }
337
338 // Loss of fraction on purpose
339 extent.X = ((int)extent.X / (int)Constants.RegionSize) + 1;
340 extent.Y = ((int)extent.Y / (int)Constants.RegionSize) + 1;
341
342 int startX = (int)(pRegionLocX - 1) * (int)Constants.RegionSize;
343 int startY = (int)(pRegionLocY - 1) * (int)Constants.RegionSize;
344
345 int endX = ((int)pRegionLocX + (int)extent.X) * (int)Constants.RegionSize;
346 int endY = ((int)pRegionLocY + (int)extent.Y) * (int)Constants.RegionSize;
347
348 List<GridRegion> neighbours = m_scene.GridService.GetRegionRange(m_regionInfo.ScopeID, startX, endX, startY, endY);
349 neighbours.RemoveAll(delegate(GridRegion r) { return r.RegionID == m_regionInfo.RegionID; });
350
351 return neighbours;
352 }
353 }
354
355 /// <summary>
356 /// This informs all neighboring regions about agent "avatar".
357 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
358 /// </summary>
359 public void EnableNeighbourChildAgents(ScenePresence avatar, List<RegionInfo> lstneighbours)
360 {
361 List<GridRegion> neighbours = new List<GridRegion>();
362
363 if (m_regionInfo != null)
364 {
365 neighbours = RequestNeighbours(avatar.Scene,m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
366 }
367 else
368 {
369 m_log.Debug("[ENABLENEIGHBOURCHILDAGENTS]: m_regionInfo was null in EnableNeighbourChildAgents, is this a NPC?");
370 }
371
372 /// We need to find the difference between the new regions where there are no child agents
373 /// and the regions where there are already child agents. We only send notification to the former.
374 List<ulong> neighbourHandles = NeighbourHandles(neighbours); // on this region
375 neighbourHandles.Add(avatar.Scene.RegionInfo.RegionHandle); // add this region too
376 List<ulong> previousRegionNeighbourHandles ;
377
378 if (avatar.Scene.CapsModule != null)
379 {
380 previousRegionNeighbourHandles =
381 new List<ulong>(avatar.Scene.CapsModule.GetChildrenSeeds(avatar.UUID).Keys);
382 }
383 else
384 {
385 previousRegionNeighbourHandles = new List<ulong>();
386 }
387
388 List<ulong> newRegions = NewNeighbours(neighbourHandles, previousRegionNeighbourHandles);
389 List<ulong> oldRegions = OldNeighbours(neighbourHandles, previousRegionNeighbourHandles);
390
391 //Dump("Current Neighbors", neighbourHandles);
392 //Dump("Previous Neighbours", previousRegionNeighbourHandles);
393 //Dump("New Neighbours", newRegions);
394 //Dump("Old Neighbours", oldRegions);
395
396 /// Update the scene presence's known regions here on this region
397 avatar.DropOldNeighbours(oldRegions);
398
399 /// Collect as many seeds as possible
400 Dictionary<ulong, string> seeds;
401 if (avatar.Scene.CapsModule != null)
402 seeds
403 = new Dictionary<ulong, string>(avatar.Scene.CapsModule.GetChildrenSeeds(avatar.UUID));
404 else
405 seeds = new Dictionary<ulong, string>();
406
407 //m_log.Debug(" !!! No. of seeds: " + seeds.Count);
408 if (!seeds.ContainsKey(avatar.Scene.RegionInfo.RegionHandle))
409 seeds.Add(avatar.Scene.RegionInfo.RegionHandle, avatar.ControllingClient.RequestClientInfo().CapsPath);
410
411 /// Create the necessary child agents
412 List<AgentCircuitData> cagents = new List<AgentCircuitData>();
413 foreach (GridRegion neighbour in neighbours)
414 {
415 if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle)
416 {
417
418 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
419 agent.BaseFolder = UUID.Zero;
420 agent.InventoryFolder = UUID.Zero;
421 agent.startpos = new Vector3(128, 128, 70);
422 agent.child = true;
423
424 if (newRegions.Contains(neighbour.RegionHandle))
425 {
426 agent.CapsPath = CapsUtil.GetRandomCapsObjectPath();
427 avatar.AddNeighbourRegion(neighbour.RegionHandle, agent.CapsPath);
428 seeds.Add(neighbour.RegionHandle, agent.CapsPath);
429 }
430 else
431 agent.CapsPath = avatar.Scene.CapsModule.GetChildSeed(avatar.UUID, neighbour.RegionHandle);
432
433 cagents.Add(agent);
434 }
435 }
436
437 /// Update all child agent with everyone's seeds
438 foreach (AgentCircuitData a in cagents)
439 {
440 a.ChildrenCapSeeds = new Dictionary<ulong, string>(seeds);
441 }
442
443 if (avatar.Scene.CapsModule != null)
444 {
445 // These two are the same thing!
446 avatar.Scene.CapsModule.SetChildrenSeed(avatar.UUID, seeds);
447 }
448 avatar.KnownRegions = seeds;
449 //avatar.Scene.DumpChildrenSeeds(avatar.UUID);
450 //avatar.DumpKnownRegions();
451
452 bool newAgent = false;
453 int count = 0;
454 foreach (GridRegion neighbour in neighbours)
455 {
456 // Don't do it if there's already an agent in that region
457 if (newRegions.Contains(neighbour.RegionHandle))
458 newAgent = true;
459 else
460 newAgent = false;
461
462 if (neighbour.RegionHandle != avatar.Scene.RegionInfo.RegionHandle)
463 {
464 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
465 try
466 {
467 d.BeginInvoke(avatar, cagents[count], neighbour, neighbour.ExternalEndPoint, newAgent,
468 InformClientOfNeighbourCompleted,
469 d);
470 }
471
472 catch (ArgumentOutOfRangeException)
473 {
474 m_log.ErrorFormat(
475 "[REGIONINFO]: Neighbour Regions response included the current region in the neighbor list. The following region will not display to the client: {0} for region {1} ({2}, {3}).",
476 neighbour.ExternalHostName,
477 neighbour.RegionHandle,
478 neighbour.RegionLocX,
479 neighbour.RegionLocY);
480 }
481 catch (Exception e)
482 {
483 m_log.ErrorFormat(
484 "[REGIONINFO]: Could not resolve external hostname {0} for region {1} ({2}, {3}). {4}",
485 neighbour.ExternalHostName,
486 neighbour.RegionHandle,
487 neighbour.RegionLocX,
488 neighbour.RegionLocY,
489 e);
490
491 // FIXME: Okay, even though we've failed, we're still going to throw the exception on,
492 // since I don't know what will happen if we just let the client continue
493
494 // XXX: Well, decided to swallow the exception instead for now. Let us see how that goes.
495 // throw e;
496
497 }
498 }
499 count++;
500 }
501 }
502
503 /// <summary>
504 /// This informs a single neighboring region about agent "avatar".
505 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
506 /// </summary>
507 public void InformNeighborChildAgent(ScenePresence avatar, GridRegion region)
508 {
509 AgentCircuitData agent = avatar.ControllingClient.RequestClientInfo();
510 agent.BaseFolder = UUID.Zero;
511 agent.InventoryFolder = UUID.Zero;
512 agent.startpos = new Vector3(128, 128, 70);
513 agent.child = true;
514
515 InformClientOfNeighbourDelegate d = InformClientOfNeighbourAsync;
516 d.BeginInvoke(avatar, agent, region, region.ExternalEndPoint, true,
517 InformClientOfNeighbourCompleted,
518 d);
519 }
520
521 #endregion
522
523 public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle); 145 public delegate void InformNeighbourThatRegionUpDelegate(INeighbourService nService, RegionInfo region, ulong regionhandle);
524 146
525 private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar) 147 private void InformNeighborsThatRegionisUpCompleted(IAsyncResult iar)
@@ -593,7 +215,10 @@ namespace OpenSim.Region.Framework.Scenes
593 try 215 try
594 { 216 {
595 //m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData); 217 //m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData);
596 m_interregionCommsOut.SendChildAgentUpdate(regionHandle, cAgentData); 218 uint x = 0, y = 0;
219 Utils.LongToUInts(regionHandle, out x, out y);
220 GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
221 m_scene.SimulationService.UpdateAgent(destination, cAgentData);
597 } 222 }
598 catch 223 catch
599 { 224 {
@@ -653,7 +278,10 @@ namespace OpenSim.Region.Framework.Scenes
653 // let's do our best, but there's not much we can do if the neighbour doesn't accept. 278 // let's do our best, but there's not much we can do if the neighbour doesn't accept.
654 279
655 //m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID); 280 //m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID);
656 m_interregionCommsOut.SendCloseAgent(regionHandle, agentID); 281 uint x = 0, y = 0;
282 Utils.LongToUInts(regionHandle, out x, out y);
283 GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
284 m_scene.SimulationService.CloseAgent(destination, agentID);
657 } 285 }
658 286
659 private void SendCloseChildAgentCompleted(IAsyncResult iar) 287 private void SendCloseChildAgentCompleted(IAsyncResult iar)
@@ -672,822 +300,11 @@ namespace OpenSim.Region.Framework.Scenes
672 d); 300 d);
673 } 301 }
674 } 302 }
675 303
676
677 /// <summary>
678 /// Try to teleport an agent to a new region.
679 /// </summary>
680 /// <param name="remoteClient"></param>
681 /// <param name="RegionHandle"></param>
682 /// <param name="position"></param>
683 /// <param name="lookAt"></param>
684 /// <param name="flags"></param>
685 public virtual void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, Vector3 position,
686 Vector3 lookAt, uint teleportFlags)
687 {
688 if (!avatar.Scene.Permissions.CanTeleport(avatar.UUID))
689 return;
690
691 bool destRegionUp = true;
692
693 IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>();
694
695 // Reset animations; the viewer does that in teleports.
696 avatar.Animator.ResetAnimations();
697
698 if (regionHandle == m_regionInfo.RegionHandle)
699 {
700 m_log.DebugFormat(
701 "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation {0} within {1}",
702 position, m_regionInfo.RegionName);
703
704 // Teleport within the same region
705 if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0)
706 {
707 Vector3 emergencyPos = new Vector3(128, 128, 128);
708
709 m_log.WarnFormat(
710 "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
711 position, avatar.Name, avatar.UUID, emergencyPos);
712 position = emergencyPos;
713 }
714
715 // TODO: Get proper AVG Height
716 float localAVHeight = 1.56f;
717 float posZLimit = 22;
718
719 // TODO: Check other Scene HeightField
720 if (position.X > 0 && position.X <= (int)Constants.RegionSize && position.Y > 0 && position.Y <=(int)Constants.RegionSize)
721 {
722 posZLimit = (float) avatar.Scene.Heightmap[(int) position.X, (int) position.Y];
723 }
724
725 float newPosZ = posZLimit + localAVHeight;
726 if (posZLimit >= (position.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
727 {
728 position.Z = newPosZ;
729 }
730
731 // Only send this if the event queue is null
732 if (eq == null)
733 avatar.ControllingClient.SendTeleportLocationStart();
734
735 avatar.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags);
736 avatar.Teleport(position);
737 }
738 else
739 {
740 uint x = 0, y = 0;
741 Utils.LongToUInts(regionHandle, out x, out y);
742 GridRegion reg = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y);
743
744 if (reg != null)
745 {
746 m_log.DebugFormat(
747 "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation to {0} in {1}",
748 position, reg.RegionName);
749
750 if (eq == null)
751 avatar.ControllingClient.SendTeleportLocationStart();
752
753 // Let's do DNS resolution only once in this process, please!
754 // This may be a costly operation. The reg.ExternalEndPoint field is not a passive field,
755 // it's actually doing a lot of work.
756 IPEndPoint endPoint = reg.ExternalEndPoint;
757 if (endPoint.Address == null)
758 {
759 // Couldn't resolve the name. Can't TP, because the viewer wants IP addresses.
760 destRegionUp = false;
761 }
762
763 if (destRegionUp)
764 {
765 uint newRegionX = (uint)(reg.RegionHandle >> 40);
766 uint newRegionY = (((uint)(reg.RegionHandle)) >> 8);
767 uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40);
768 uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8);
769
770 // Fixing a bug where teleporting while sitting results in the avatar ending up removed from
771 // both regions
772 if (avatar.ParentID != (uint)0)
773 avatar.StandUp();
774
775 if (!avatar.ValidateAttachments())
776 {
777 avatar.ControllingClient.SendTeleportFailed("Inconsistent attachment state");
778 return;
779 }
780
781 // the avatar.Close below will clear the child region list. We need this below for (possibly)
782 // closing the child agents, so save it here (we need a copy as it is Clear()-ed).
783 //List<ulong> childRegions = new List<ulong>(avatar.GetKnownRegionList());
784 // Compared to ScenePresence.CrossToNewRegion(), there's no obvious code to handle a teleport
785 // failure at this point (unlike a border crossing failure). So perhaps this can never fail
786 // once we reach here...
787 //avatar.Scene.RemoveCapsHandler(avatar.UUID);
788
789 string capsPath = String.Empty;
790 AgentCircuitData agentCircuit = avatar.ControllingClient.RequestClientInfo();
791 agentCircuit.BaseFolder = UUID.Zero;
792 agentCircuit.InventoryFolder = UUID.Zero;
793 agentCircuit.startpos = position;
794 agentCircuit.child = true;
795
796 if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY))
797 {
798 // brand new agent, let's create a new caps seed
799 agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath();
800 }
801
802 string reason = String.Empty;
803
804 // Let's create an agent there if one doesn't exist yet.
805 //if (!m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, agentCircuit))
806 if (!m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, agentCircuit, teleportFlags, out reason))
807 {
808 avatar.ControllingClient.SendTeleportFailed(String.Format("Destination is not accepting teleports: {0}",
809 reason));
810 return;
811 }
812
813 // OK, it got this agent. Let's close some child agents
814 avatar.CloseChildAgents(newRegionX, newRegionY);
815
816 if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY))
817 {
818 #region IP Translation for NAT
819 IClientIPEndpoint ipepClient;
820 if (avatar.ClientView.TryGet(out ipepClient))
821 {
822 capsPath
823 = "http://"
824 + NetworkUtil.GetHostFor(ipepClient.EndPoint, reg.ExternalHostName)
825 + ":"
826 + reg.HttpPort
827 + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
828 }
829 else
830 {
831 capsPath
832 = "http://"
833 + reg.ExternalHostName
834 + ":"
835 + reg.HttpPort
836 + CapsUtil.GetCapsSeedPath(agentCircuit.CapsPath);
837 }
838 #endregion
839
840 if (eq != null)
841 {
842 #region IP Translation for NAT
843 // Uses ipepClient above
844 if (avatar.ClientView.TryGet(out ipepClient))
845 {
846 endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
847 }
848 #endregion
849
850 eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID);
851
852 // ES makes the client send a UseCircuitCode message to the destination,
853 // which triggers a bunch of things there.
854 // So let's wait
855 Thread.Sleep(2000);
856
857 eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath);
858 }
859 else
860 {
861 avatar.ControllingClient.InformClientOfNeighbour(reg.RegionHandle, endPoint);
862 }
863 }
864 else
865 {
866 agentCircuit.CapsPath = avatar.Scene.CapsModule.GetChildSeed(avatar.UUID, reg.RegionHandle);
867 capsPath = "http://" + reg.ExternalHostName + ":" + reg.HttpPort
868 + "/CAPS/" + agentCircuit.CapsPath + "0000/";
869 }
870
871 // Expect avatar crossing is a heavy-duty function at the destination.
872 // That is where MakeRoot is called, which fetches appearance and inventory.
873 // Plus triggers OnMakeRoot, which spawns a series of asynchronous updates.
874 //m_commsProvider.InterRegion.ExpectAvatarCrossing(reg.RegionHandle, avatar.ControllingClient.AgentId,
875 // position, false);
876
877 //{
878 // avatar.ControllingClient.SendTeleportFailed("Problem with destination.");
879 // // We should close that agent we just created over at destination...
880 // List<ulong> lst = new List<ulong>();
881 // lst.Add(reg.RegionHandle);
882 // SendCloseChildAgentAsync(avatar.UUID, lst);
883 // return;
884 //}
885
886 SetInTransit(avatar.UUID);
887 // Let's send a full update of the agent. This is a synchronous call.
888 AgentData agent = new AgentData();
889 avatar.CopyTo(agent);
890 agent.Position = position;
891 agent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort +
892 "/agent/" + avatar.UUID.ToString() + "/" + avatar.Scene.RegionInfo.RegionHandle.ToString() + "/release/";
893
894 m_interregionCommsOut.SendChildAgentUpdate(reg.RegionHandle, agent);
895
896 m_log.DebugFormat(
897 "[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, avatar.UUID);
898
899
900 if (eq != null)
901 {
902 eq.TeleportFinishEvent(reg.RegionHandle, 13, endPoint,
903 0, teleportFlags, capsPath, avatar.UUID);
904 }
905 else
906 {
907 avatar.ControllingClient.SendRegionTeleport(reg.RegionHandle, 13, endPoint, 4,
908 teleportFlags, capsPath);
909 }
910
911 // TeleportFinish makes the client send CompleteMovementIntoRegion (at the destination), which
912 // trigers a whole shebang of things there, including MakeRoot. So let's wait for confirmation
913 // that the client contacted the destination before we send the attachments and close things here.
914 if (!WaitForCallback(avatar.UUID))
915 {
916 // Client never contacted destination. Let's restore everything back
917 avatar.ControllingClient.SendTeleportFailed("Problems connecting to destination.");
918
919 ResetFromTransit(avatar.UUID);
920
921 // Yikes! We should just have a ref to scene here.
922 avatar.Scene.InformClientOfNeighbours(avatar);
923
924 // Finally, kill the agent we just created at the destination.
925 m_interregionCommsOut.SendCloseAgent(reg.RegionHandle, avatar.UUID);
926
927 return;
928 }
929
930 // Can't go back from here
931 if (KiPrimitive != null)
932 {
933 KiPrimitive(avatar.LocalId);
934 }
935
936 avatar.MakeChildAgent();
937
938 // CrossAttachmentsIntoNewRegion is a synchronous call. We shouldn't need to wait after it
939 avatar.CrossAttachmentsIntoNewRegion(reg.RegionHandle, true);
940
941 // Finally, let's close this previously-known-as-root agent, when the jump is outside the view zone
942
943 if (Util.IsOutsideView(oldRegionX, newRegionX, oldRegionY, newRegionY))
944 {
945 Thread.Sleep(5000);
946 avatar.Close();
947 CloseConnection(avatar.UUID);
948 }
949 else
950 // now we have a child agent in this region.
951 avatar.Reset();
952
953
954 // if (teleport success) // seems to be always success here
955 // the user may change their profile information in other region,
956 // so the userinfo in UserProfileCache is not reliable any more, delete it
957 if (avatar.Scene.NeedSceneCacheClear(avatar.UUID))
958 {
959 m_commsProvider.UserProfileCacheService.RemoveUser(avatar.UUID);
960 m_log.DebugFormat(
961 "[SCENE COMMUNICATION SERVICE]: User {0} is going to another region, profile cache removed",
962 avatar.UUID);
963 }
964 }
965 else
966 {
967 avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down");
968 }
969 }
970 else
971 {
972 // TP to a place that doesn't exist (anymore)
973 // Inform the viewer about that
974 avatar.ControllingClient.SendTeleportFailed("The region you tried to teleport to doesn't exist anymore");
975
976 // and set the map-tile to '(Offline)'
977 uint regX, regY;
978 Utils.LongToUInts(regionHandle, out regX, out regY);
979
980 MapBlockData block = new MapBlockData();
981 block.X = (ushort)(regX / Constants.RegionSize);
982 block.Y = (ushort)(regY / Constants.RegionSize);
983 block.Access = 254; // == not there
984
985 List<MapBlockData> blocks = new List<MapBlockData>();
986 blocks.Add(block);
987 avatar.ControllingClient.SendMapBlock(blocks, 0);
988 }
989 }
990 }
991
992 protected bool IsOutsideRegion(Scene s, Vector3 pos)
993 {
994
995 if (s.TestBorderCross(pos,Cardinals.N))
996 return true;
997 if (s.TestBorderCross(pos, Cardinals.S))
998 return true;
999 if (s.TestBorderCross(pos, Cardinals.E))
1000 return true;
1001 if (s.TestBorderCross(pos, Cardinals.W))
1002 return true;
1003
1004 return false;
1005 }
1006
1007 public bool WaitForCallback(UUID id)
1008 {
1009 int count = 200;
1010 while (m_agentsInTransit.Contains(id) && count-- > 0)
1011 {
1012 //m_log.Debug(" >>> Waiting... " + count);
1013 Thread.Sleep(100);
1014 }
1015
1016 if (count > 0)
1017 return true;
1018 else
1019 return false;
1020 }
1021
1022 public bool ReleaseAgent(UUID id)
1023 {
1024 //m_log.Debug(" >>> ReleaseAgent called <<< ");
1025 return ResetFromTransit(id);
1026 }
1027
1028 public void SetInTransit(UUID id)
1029 {
1030 lock (m_agentsInTransit)
1031 {
1032 if (!m_agentsInTransit.Contains(id))
1033 m_agentsInTransit.Add(id);
1034 }
1035 }
1036
1037 protected bool ResetFromTransit(UUID id)
1038 {
1039 lock (m_agentsInTransit)
1040 {
1041 if (m_agentsInTransit.Contains(id))
1042 {
1043 m_agentsInTransit.Remove(id);
1044 return true;
1045 }
1046 }
1047 return false;
1048 }
1049
1050 private List<ulong> NeighbourHandles(List<GridRegion> neighbours)
1051 {
1052 List<ulong> handles = new List<ulong>();
1053 foreach (GridRegion reg in neighbours)
1054 {
1055 handles.Add(reg.RegionHandle);
1056 }
1057 return handles;
1058 }
1059
1060 private List<ulong> NewNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours)
1061 {
1062 return currentNeighbours.FindAll(delegate(ulong handle) { return !previousNeighbours.Contains(handle); });
1063 }
1064
1065// private List<ulong> CommonNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours)
1066// {
1067// return currentNeighbours.FindAll(delegate(ulong handle) { return previousNeighbours.Contains(handle); });
1068// }
1069
1070 private List<ulong> OldNeighbours(List<ulong> currentNeighbours, List<ulong> previousNeighbours)
1071 {
1072 return previousNeighbours.FindAll(delegate(ulong handle) { return !currentNeighbours.Contains(handle); });
1073 }
1074
1075 public void CrossAgentToNewRegion(Scene scene, ScenePresence agent, bool isFlying)
1076 {
1077 Vector3 pos = agent.AbsolutePosition;
1078 Vector3 newpos = new Vector3(pos.X, pos.Y, pos.Z);
1079 uint neighbourx = m_regionInfo.RegionLocX;
1080 uint neighboury = m_regionInfo.RegionLocY;
1081 const float boundaryDistance = 1.7f;
1082 Vector3 northCross = new Vector3(0,boundaryDistance, 0);
1083 Vector3 southCross = new Vector3(0, -1 * boundaryDistance, 0);
1084 Vector3 eastCross = new Vector3(boundaryDistance, 0, 0);
1085 Vector3 westCross = new Vector3(-1 * boundaryDistance, 0, 0);
1086
1087 // distance to edge that will trigger crossing
1088
1089
1090 // distance into new region to place avatar
1091 const float enterDistance = 0.5f;
1092
1093 if (scene.TestBorderCross(pos + westCross, Cardinals.W))
1094 {
1095 if (scene.TestBorderCross(pos + northCross, Cardinals.N))
1096 {
1097 Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
1098 neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
1099 }
1100 else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
1101 {
1102 Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
1103 if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0)
1104 {
1105 neighboury--;
1106 newpos.Y = Constants.RegionSize - enterDistance;
1107 }
1108 else
1109 {
1110 neighboury = b.TriggerRegionY;
1111 neighbourx = b.TriggerRegionX;
1112
1113 Vector3 newposition = pos;
1114 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
1115 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
1116 agent.ControllingClient.SendAgentAlertMessage(
1117 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
1118 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
1119 return;
1120 }
1121 }
1122
1123 Border ba = scene.GetCrossedBorder(pos + westCross, Cardinals.W);
1124 if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0)
1125 {
1126 neighbourx--;
1127 newpos.X = Constants.RegionSize - enterDistance;
1128 }
1129 else
1130 {
1131 neighboury = ba.TriggerRegionY;
1132 neighbourx = ba.TriggerRegionX;
1133
1134
1135 Vector3 newposition = pos;
1136 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
1137 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
1138 agent.ControllingClient.SendAgentAlertMessage(
1139 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
1140 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
1141
1142
1143 return;
1144 }
1145
1146 }
1147 else if (scene.TestBorderCross(pos + eastCross, Cardinals.E))
1148 {
1149 Border b = scene.GetCrossedBorder(pos + eastCross, Cardinals.E);
1150 neighbourx += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
1151 newpos.X = enterDistance;
1152
1153 if (scene.TestBorderCross(pos + southCross, Cardinals.S))
1154 {
1155 Border ba = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
1156 if (ba.TriggerRegionX == 0 && ba.TriggerRegionY == 0)
1157 {
1158 neighboury--;
1159 newpos.Y = Constants.RegionSize - enterDistance;
1160 }
1161 else
1162 {
1163 neighboury = ba.TriggerRegionY;
1164 neighbourx = ba.TriggerRegionX;
1165 Vector3 newposition = pos;
1166 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
1167 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
1168 agent.ControllingClient.SendAgentAlertMessage(
1169 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
1170 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
1171 return;
1172 }
1173 }
1174 else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
1175 {
1176 Border c = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
1177 neighboury += (uint)(int)(c.BorderLine.Z / (int)Constants.RegionSize);
1178 newpos.Y = enterDistance;
1179 }
1180
1181
1182 }
1183 else if (scene.TestBorderCross(pos + southCross, Cardinals.S))
1184 {
1185 Border b = scene.GetCrossedBorder(pos + southCross, Cardinals.S);
1186 if (b.TriggerRegionX == 0 && b.TriggerRegionY == 0)
1187 {
1188 neighboury--;
1189 newpos.Y = Constants.RegionSize - enterDistance;
1190 }
1191 else
1192 {
1193 neighboury = b.TriggerRegionY;
1194 neighbourx = b.TriggerRegionX;
1195 Vector3 newposition = pos;
1196 newposition.X += (scene.RegionInfo.RegionLocX - neighbourx) * Constants.RegionSize;
1197 newposition.Y += (scene.RegionInfo.RegionLocY - neighboury) * Constants.RegionSize;
1198 agent.ControllingClient.SendAgentAlertMessage(
1199 String.Format("Moving you to region {0},{1}", neighbourx, neighboury), false);
1200 InformClientToInitateTeleportToLocation(agent, neighbourx, neighboury, newposition, scene);
1201 return;
1202 }
1203 }
1204 else if (scene.TestBorderCross(pos + northCross, Cardinals.N))
1205 {
1206
1207 Border b = scene.GetCrossedBorder(pos + northCross, Cardinals.N);
1208 neighboury += (uint)(int)(b.BorderLine.Z / (int)Constants.RegionSize);
1209 newpos.Y = enterDistance;
1210 }
1211
1212 /*
1213
1214 if (pos.X < boundaryDistance) //West
1215 {
1216 neighbourx--;
1217 newpos.X = Constants.RegionSize - enterDistance;
1218 }
1219 else if (pos.X > Constants.RegionSize - boundaryDistance) // East
1220 {
1221 neighbourx++;
1222 newpos.X = enterDistance;
1223 }
1224
1225 if (pos.Y < boundaryDistance) // South
1226 {
1227 neighboury--;
1228 newpos.Y = Constants.RegionSize - enterDistance;
1229 }
1230 else if (pos.Y > Constants.RegionSize - boundaryDistance) // North
1231 {
1232 neighboury++;
1233 newpos.Y = enterDistance;
1234 }
1235 */
1236
1237 CrossAgentToNewRegionDelegate d = CrossAgentToNewRegionAsync;
1238 d.BeginInvoke(agent, newpos, neighbourx, neighboury, isFlying, CrossAgentToNewRegionCompleted, d);
1239 }
1240
1241 public delegate void InformClientToInitateTeleportToLocationDelegate(ScenePresence agent, uint regionX, uint regionY,
1242 Vector3 position,
1243 Scene initiatingScene);
1244
1245 public void InformClientToInitateTeleportToLocation(ScenePresence agent, uint regionX, uint regionY, Vector3 position,
1246 Scene initiatingScene)
1247 {
1248
1249 // This assumes that we know what our neighbors are.
1250
1251 InformClientToInitateTeleportToLocationDelegate d = InformClientToInitiateTeleportToLocationAsync;
1252 d.BeginInvoke(agent,regionX,regionY,position,initiatingScene,
1253 InformClientToInitiateTeleportToLocationCompleted,
1254 d);
1255 }
1256
1257 public void InformClientToInitiateTeleportToLocationAsync(ScenePresence agent, uint regionX, uint regionY, Vector3 position,
1258 Scene initiatingScene)
1259 {
1260 Thread.Sleep(10000);
1261 IMessageTransferModule im = initiatingScene.RequestModuleInterface<IMessageTransferModule>();
1262 if (im != null)
1263 {
1264 UUID gotoLocation = Util.BuildFakeParcelID(
1265 Util.UIntsToLong(
1266 (regionX *
1267 (uint)Constants.RegionSize),
1268 (regionY *
1269 (uint)Constants.RegionSize)),
1270 (uint)(int)position.X,
1271 (uint)(int)position.Y,
1272 (uint)(int)position.Z);
1273 GridInstantMessage m = new GridInstantMessage(initiatingScene, UUID.Zero,
1274 "Region", agent.UUID,
1275 (byte)InstantMessageDialog.GodLikeRequestTeleport, false,
1276 "", gotoLocation, false, new Vector3(127, 0, 0),
1277 new Byte[0]);
1278 im.SendInstantMessage(m, delegate(bool success)
1279 {
1280 m_log.DebugFormat("[CLIENT]: Client Initiating Teleport sending IM success = {0}", success);
1281 });
1282
1283 }
1284 }
1285
1286 private void InformClientToInitiateTeleportToLocationCompleted(IAsyncResult iar)
1287 {
1288 InformClientToInitateTeleportToLocationDelegate icon =
1289 (InformClientToInitateTeleportToLocationDelegate) iar.AsyncState;
1290 icon.EndInvoke(iar);
1291 }
1292
1293 public delegate ScenePresence CrossAgentToNewRegionDelegate(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying);
1294
1295 /// <summary>
1296 /// This Closes child agents on neighboring regions
1297 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
1298 /// </summary>
1299 protected ScenePresence CrossAgentToNewRegionAsync(ScenePresence agent, Vector3 pos, uint neighbourx, uint neighboury, bool isFlying)
1300 {
1301 m_log.DebugFormat("[SCENE COMM]: Crossing agent {0} {1} to {2}-{3}", agent.Firstname, agent.Lastname, neighbourx, neighboury);
1302
1303 ulong neighbourHandle = Utils.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize));
1304
1305 int x = (int)(neighbourx * Constants.RegionSize), y = (int)(neighboury * Constants.RegionSize);
1306 GridRegion neighbourRegion = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, (int)x, (int)y);
1307
1308 if (neighbourRegion != null && agent.ValidateAttachments())
1309 {
1310 pos = pos + (agent.Velocity);
1311
1312 //CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID);
1313 //if (userInfo != null)
1314 //{
1315 // userInfo.DropInventory();
1316 //}
1317 //else
1318 //{
1319 // m_log.WarnFormat("[SCENE COMM]: No cached user info found for {0} {1} on leaving region {2}",
1320 // agent.Name, agent.UUID, agent.Scene.RegionInfo.RegionName);
1321 //}
1322
1323 //bool crossingSuccessful =
1324 // CrossToNeighbouringRegion(neighbourHandle, agent.ControllingClient.AgentId, pos,
1325 //isFlying);
1326
1327 SetInTransit(agent.UUID);
1328 AgentData cAgent = new AgentData();
1329 agent.CopyTo(cAgent);
1330 cAgent.Position = pos;
1331 if (isFlying)
1332 cAgent.ControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
1333 cAgent.CallbackURI = "http://" + m_regionInfo.ExternalHostName + ":" + m_regionInfo.HttpPort +
1334 "/agent/" + agent.UUID.ToString() + "/" + agent.Scene.RegionInfo.RegionHandle.ToString() + "/release/";
1335
1336 m_interregionCommsOut.SendChildAgentUpdate(neighbourHandle, cAgent);
1337
1338 // Next, let's close the child agent connections that are too far away.
1339 agent.CloseChildAgents(neighbourx, neighboury);
1340
1341 //AgentCircuitData circuitdata = m_controllingClient.RequestClientInfo();
1342 agent.ControllingClient.RequestClientInfo();
1343
1344 //m_log.Debug("BEFORE CROSS");
1345 //Scene.DumpChildrenSeeds(UUID);
1346 //DumpKnownRegions();
1347 string agentcaps;
1348 if (!agent.KnownRegions.TryGetValue(neighbourRegion.RegionHandle, out agentcaps))
1349 {
1350 m_log.ErrorFormat("[SCENE COMM]: No CAPS information for region handle {0}, exiting CrossToNewRegion.",
1351 neighbourRegion.RegionHandle);
1352 return agent;
1353 }
1354 // TODO Should construct this behind a method
1355 string capsPath =
1356 "http://" + neighbourRegion.ExternalHostName + ":" + neighbourRegion.HttpPort
1357 + "/CAPS/" + agentcaps /*circuitdata.CapsPath*/ + "0000/";
1358
1359 m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1}", capsPath, agent.UUID);
1360
1361 IEventQueue eq = agent.Scene.RequestModuleInterface<IEventQueue>();
1362 if (eq != null)
1363 {
1364 eq.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
1365 capsPath, agent.UUID, agent.ControllingClient.SessionId);
1366 }
1367 else
1368 {
1369 agent.ControllingClient.CrossRegion(neighbourHandle, pos, agent.Velocity, neighbourRegion.ExternalEndPoint,
1370 capsPath);
1371 }
1372
1373 if (!WaitForCallback(agent.UUID))
1374 {
1375 ResetFromTransit(agent.UUID);
1376
1377 // Yikes! We should just have a ref to scene here.
1378 agent.Scene.InformClientOfNeighbours(agent);
1379
1380 return agent;
1381 }
1382
1383 agent.MakeChildAgent();
1384 // now we have a child agent in this region. Request all interesting data about other (root) agents
1385 agent.SendInitialFullUpdateToAllClients();
1386
1387 agent.CrossAttachmentsIntoNewRegion(neighbourHandle, true);
1388
1389 // m_scene.SendKillObject(m_localId);
1390
1391 agent.Scene.NotifyMyCoarseLocationChange();
1392 // the user may change their profile information in other region,
1393 // so the userinfo in UserProfileCache is not reliable any more, delete it
1394 if (agent.Scene.NeedSceneCacheClear(agent.UUID))
1395 {
1396 agent.Scene.CommsManager.UserProfileCacheService.RemoveUser(agent.UUID);
1397 m_log.DebugFormat(
1398 "[SCENE COMM]: User {0} is going to another region, profile cache removed", agent.UUID);
1399 }
1400 }
1401
1402 //m_log.Debug("AFTER CROSS");
1403 //Scene.DumpChildrenSeeds(UUID);
1404 //DumpKnownRegions();
1405 return agent;
1406 }
1407
1408 private void CrossAgentToNewRegionCompleted(IAsyncResult iar)
1409 {
1410 CrossAgentToNewRegionDelegate icon = (CrossAgentToNewRegionDelegate)iar.AsyncState;
1411 ScenePresence agent = icon.EndInvoke(iar);
1412
1413 // If the cross was successful, this agent is a child agent
1414 if (agent.IsChildAgent)
1415 {
1416 agent.Reset();
1417 }
1418 else // Not successful
1419 {
1420 //CachedUserInfo userInfo = m_commsProvider.UserProfileCacheService.GetUserDetails(agent.UUID);
1421 //if (userInfo != null)
1422 //{
1423 // userInfo.FetchInventory();
1424 //}
1425 agent.RestoreInCurrentScene();
1426 }
1427 // In any case
1428 agent.NotInTransit();
1429
1430 //m_log.DebugFormat("[SCENE COMM]: Crossing agent {0} {1} completed.", agent.Firstname, agent.Lastname);
1431 }
1432
1433
1434 public void LogOffUser(UUID userid, UUID regionid, ulong regionhandle, Vector3 position, Vector3 lookat)
1435 {
1436 m_commsProvider.LogOffUser(userid, regionid, regionhandle, position, lookat);
1437 }
1438
1439 // deprecated as of 2008-08-27
1440 public void LogOffUser(UUID userid, UUID regionid, ulong regionhandle, float posx, float posy, float posz)
1441 {
1442 m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz);
1443 }
1444
1445 public void ClearUserAgent(UUID avatarID)
1446 {
1447 m_commsProvider.UserService.ClearUserAgent(avatarID);
1448 }
1449
1450 public void AddNewUserFriend(UUID friendlistowner, UUID friend, uint perms)
1451 {
1452 m_commsProvider.AddNewUserFriend(friendlistowner, friend, perms);
1453 }
1454
1455 public void UpdateUserFriendPerms(UUID friendlistowner, UUID friend, uint perms)
1456 {
1457 m_commsProvider.UpdateUserFriendPerms(friendlistowner, friend, perms);
1458 }
1459
1460 public void RemoveUserFriend(UUID friendlistowner, UUID friend)
1461 {
1462 m_commsProvider.RemoveUserFriend(friendlistowner, friend);
1463 }
1464
1465 public List<FriendListItem> GetUserFriendList(UUID friendlistowner)
1466 {
1467 return m_commsProvider.GetUserFriendList(friendlistowner);
1468 }
1469
1470 public List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(UUID queryID, string query)
1471 {
1472 return m_commsProvider.GenerateAgentPickerRequestResponse(queryID, query);
1473 }
1474
1475 public List<GridRegion> RequestNamedRegions(string name, int maxNumber) 304 public List<GridRegion> RequestNamedRegions(string name, int maxNumber)
1476 { 305 {
1477 return m_scene.GridService.GetRegionsByName(UUID.Zero, name, maxNumber); 306 return m_scene.GridService.GetRegionsByName(UUID.Zero, name, maxNumber);
1478 } 307 }
1479 308
1480 //private void Dump(string msg, List<ulong> handles)
1481 //{
1482 // m_log.InfoFormat("-------------- HANDLE DUMP ({0}) ---------", msg);
1483 // foreach (ulong handle in handles)
1484 // {
1485 // uint x, y;
1486 // Utils.LongToUInts(handle, out x, out y);
1487 // x = x / Constants.RegionSize;
1488 // y = y / Constants.RegionSize;
1489 // m_log.InfoFormat("({0}, {1})", x, y);
1490 // }
1491 //}
1492 } 309 }
1493} 310}
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs
index c2e3370..6395d98 100644
--- a/OpenSim/Region/Framework/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs
@@ -468,11 +468,11 @@ namespace OpenSim.Region.Framework.Scenes
468 return presences; 468 return presences;
469 } 469 }
470 470
471 public RegionInfo GetRegionInfo(ulong regionHandle) 471 public RegionInfo GetRegionInfo(UUID regionID)
472 { 472 {
473 foreach (Scene scene in m_localScenes) 473 foreach (Scene scene in m_localScenes)
474 { 474 {
475 if (scene.RegionInfo.RegionHandle == regionHandle) 475 if (scene.RegionInfo.RegionID == regionID)
476 { 476 {
477 return scene.RegionInfo; 477 return scene.RegionInfo;
478 } 478 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index eb7f5ff..168912e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -34,7 +34,6 @@ using System.Reflection;
34using OpenMetaverse; 34using OpenMetaverse;
35using log4net; 35using log4net;
36using OpenSim.Framework; 36using OpenSim.Framework;
37using OpenSim.Framework.Communications.Cache;
38using OpenSim.Region.Framework.Interfaces; 37using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes.Scripting; 38using OpenSim.Region.Framework.Scenes.Scripting;
40 39
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 8545425..711f9d9 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -33,12 +33,12 @@ using OpenMetaverse;
33using log4net; 33using log4net;
34using OpenSim.Framework; 34using OpenSim.Framework;
35using OpenSim.Framework.Client; 35using OpenSim.Framework.Client;
36using OpenSim.Framework.Communications.Cache;
37using OpenSim.Region.Framework.Interfaces; 36using OpenSim.Region.Framework.Interfaces;
38using OpenSim.Region.Framework.Scenes.Animation; 37using OpenSim.Region.Framework.Scenes.Animation;
39using OpenSim.Region.Framework.Scenes.Types; 38using OpenSim.Region.Framework.Scenes.Types;
40using OpenSim.Region.Physics.Manager; 39using OpenSim.Region.Physics.Manager;
41using GridRegion = OpenSim.Services.Interfaces.GridRegion; 40using GridRegion = OpenSim.Services.Interfaces.GridRegion;
41using OpenSim.Services.Interfaces;
42 42
43namespace OpenSim.Region.Framework.Scenes 43namespace OpenSim.Region.Framework.Scenes
44{ 44{
@@ -246,6 +246,8 @@ namespace OpenSim.Region.Framework.Scenes
246 246
247 // For teleports and crossings callbacks 247 // For teleports and crossings callbacks
248 string m_callbackURI; 248 string m_callbackURI;
249 UUID m_originRegionID;
250
249 ulong m_rootRegionHandle; 251 ulong m_rootRegionHandle;
250 252
251 /// <value> 253 /// <value>
@@ -1070,6 +1072,8 @@ namespace OpenSim.Region.Framework.Scenes
1070 /// </summary> 1072 /// </summary>
1071 public void CompleteMovement() 1073 public void CompleteMovement()
1072 { 1074 {
1075 //m_log.Debug("[SCENE PRESENCE]: CompleteMovement");
1076
1073 Vector3 look = Velocity; 1077 Vector3 look = Velocity;
1074 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) 1078 if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
1075 { 1079 {
@@ -1094,7 +1098,7 @@ namespace OpenSim.Region.Framework.Scenes
1094 if ((m_callbackURI != null) && !m_callbackURI.Equals("")) 1098 if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
1095 { 1099 {
1096 m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI); 1100 m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI);
1097 Scene.SendReleaseAgent(m_rootRegionHandle, UUID, m_callbackURI); 1101 Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI);
1098 m_callbackURI = null; 1102 m_callbackURI = null;
1099 } 1103 }
1100 1104
@@ -1103,6 +1107,16 @@ namespace OpenSim.Region.Framework.Scenes
1103 m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look); 1107 m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look);
1104 SendInitialData(); 1108 SendInitialData();
1105 1109
1110 // Create child agents in neighbouring regions
1111 if (!m_isChildAgent)
1112 {
1113 IAgentTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IAgentTransferModule>();
1114 if (m_agentTransfer != null)
1115 m_agentTransfer.EnableChildAgents(this);
1116 else
1117 m_log.DebugFormat("[SCENE PRESENCE]: Unable to create child agents in neighbours, because AgentTransferModule is not active");
1118 }
1119
1106 } 1120 }
1107 1121
1108 /// <summary> 1122 /// <summary>
@@ -2155,6 +2169,7 @@ namespace OpenSim.Region.Framework.Scenes
2155 { 2169 {
2156 if (m_isChildAgent) 2170 if (m_isChildAgent)
2157 { 2171 {
2172 // WHAT???
2158 m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!"); 2173 m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!");
2159 2174
2160 // we have to reset the user's child agent connections. 2175 // we have to reset the user's child agent connections.
@@ -2178,7 +2193,9 @@ namespace OpenSim.Region.Framework.Scenes
2178 2193
2179 if (m_scene.SceneGridService != null) 2194 if (m_scene.SceneGridService != null)
2180 { 2195 {
2181 m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List<RegionInfo>()); 2196 IAgentTransferModule m_agentTransfer = m_scene.RequestModuleInterface<IAgentTransferModule>();
2197 if (m_agentTransfer != null)
2198 m_agentTransfer.EnableChildAgents(this);
2182 } 2199 }
2183 2200
2184 return; 2201 return;
@@ -2475,14 +2492,9 @@ namespace OpenSim.Region.Framework.Scenes
2475 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, 2492 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
2476 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); 2493 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
2477 2494
2478 if (!m_isChildAgent)
2479 {
2480 m_scene.InformClientOfNeighbours(this);
2481 }
2482
2483 SendInitialFullUpdateToAllClients(); 2495 SendInitialFullUpdateToAllClients();
2484 SendAppearanceToAllOtherAgents(); 2496 SendAppearanceToAllOtherAgents();
2485 } 2497 }
2486 2498
2487 /// <summary> 2499 /// <summary>
2488 /// Tell the client for this scene presence what items it should be wearing now 2500 /// Tell the client for this scene presence what items it should be wearing now
@@ -2562,14 +2574,19 @@ namespace OpenSim.Region.Framework.Scenes
2562 } 2574 }
2563 } 2575 }
2564 } 2576 }
2577
2565 } 2578 }
2566 2579
2580
2567 #endregion Bake Cache Check 2581 #endregion Bake Cache Check
2568 2582
2569 m_appearance.SetAppearance(textureEntry, visualParams); 2583 m_appearance.SetAppearance(textureEntry, visualParams);
2570 if (m_appearance.AvatarHeight > 0) 2584 if (m_appearance.AvatarHeight > 0)
2571 SetHeight(m_appearance.AvatarHeight); 2585 SetHeight(m_appearance.AvatarHeight);
2572 m_scene.CommsManager.AvatarService.UpdateUserAppearance(m_controllingClient.AgentId, m_appearance); 2586
2587 // This is not needed, because only the transient data changed
2588 //AvatarData adata = new AvatarData(m_appearance);
2589 //m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
2573 2590
2574 SendAppearanceToAllOtherAgents(); 2591 SendAppearanceToAllOtherAgents();
2575 if (!m_startAnimationSet) 2592 if (!m_startAnimationSet)
@@ -2589,7 +2606,8 @@ namespace OpenSim.Region.Framework.Scenes
2589 public void SetWearable(int wearableId, AvatarWearable wearable) 2606 public void SetWearable(int wearableId, AvatarWearable wearable)
2590 { 2607 {
2591 m_appearance.SetWearable(wearableId, wearable); 2608 m_appearance.SetWearable(wearableId, wearable);
2592 m_scene.CommsManager.AvatarService.UpdateUserAppearance(m_controllingClient.AgentId, m_appearance); 2609 AvatarData adata = new AvatarData(m_appearance);
2610 m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
2593 m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++); 2611 m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
2594 } 2612 }
2595 2613
@@ -2867,11 +2885,14 @@ namespace OpenSim.Region.Framework.Scenes
2867 // For now, assign god level 200 to anyone 2885 // For now, assign god level 200 to anyone
2868 // who is granted god powers, but has no god level set. 2886 // who is granted god powers, but has no god level set.
2869 // 2887 //
2870 CachedUserInfo profile = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(agentID); 2888 UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, agentID);
2871 if (profile.UserProfile.GodLevel > 0) 2889 if (account != null)
2872 m_godlevel = profile.UserProfile.GodLevel; 2890 {
2873 else 2891 if (account.UserLevel > 0)
2874 m_godlevel = 200; 2892 m_godlevel = account.UserLevel;
2893 else
2894 m_godlevel = 200;
2895 }
2875 } 2896 }
2876 else 2897 else
2877 { 2898 {
@@ -2937,7 +2958,7 @@ namespace OpenSim.Region.Framework.Scenes
2937 public void CopyTo(AgentData cAgent) 2958 public void CopyTo(AgentData cAgent)
2938 { 2959 {
2939 cAgent.AgentID = UUID; 2960 cAgent.AgentID = UUID;
2940 cAgent.RegionHandle = m_rootRegionHandle; 2961 cAgent.RegionID = Scene.RegionInfo.RegionID;
2941 2962
2942 cAgent.Position = AbsolutePosition; 2963 cAgent.Position = AbsolutePosition;
2943 cAgent.Velocity = m_velocity; 2964 cAgent.Velocity = m_velocity;
@@ -3036,7 +3057,7 @@ namespace OpenSim.Region.Framework.Scenes
3036 3057
3037 public void CopyFrom(AgentData cAgent) 3058 public void CopyFrom(AgentData cAgent)
3038 { 3059 {
3039 m_rootRegionHandle = cAgent.RegionHandle; 3060 m_originRegionID = cAgent.RegionID;
3040 3061
3041 m_callbackURI = cAgent.CallbackURI; 3062 m_callbackURI = cAgent.CallbackURI;
3042 3063
@@ -3406,7 +3427,7 @@ namespace OpenSim.Region.Framework.Scenes
3406 } 3427 }
3407 } 3428 }
3408 3429
3409 public bool CrossAttachmentsIntoNewRegion(ulong regionHandle, bool silent) 3430 public bool CrossAttachmentsIntoNewRegion(GridRegion destination, bool silent)
3410 { 3431 {
3411 lock (m_attachments) 3432 lock (m_attachments)
3412 { 3433 {
@@ -3427,8 +3448,8 @@ namespace OpenSim.Region.Framework.Scenes
3427 gobj.AbsolutePosition = gobj.RootPart.AttachedPos; 3448 gobj.AbsolutePosition = gobj.RootPart.AttachedPos;
3428 gobj.RootPart.IsAttachment = false; 3449 gobj.RootPart.IsAttachment = false;
3429 //gobj.RootPart.LastOwnerID = gobj.GetFromAssetID(); 3450 //gobj.RootPart.LastOwnerID = gobj.GetFromAssetID();
3430 m_log.DebugFormat("[ATTACHMENT]: Sending attachment {0} to region {1}", gobj.UUID, regionHandle); 3451 m_log.DebugFormat("[ATTACHMENT]: Sending attachment {0} to region {1}", gobj.UUID, destination.RegionName);
3431 m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj, silent); 3452 m_scene.CrossPrimGroupIntoNewRegion(destination, gobj, silent);
3432 } 3453 }
3433 } 3454 }
3434 m_attachments.Clear(); 3455 m_attachments.Clear();
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
index e4296ef..c6cf4cc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
@@ -31,7 +31,6 @@ using OpenMetaverse;
31using log4net; 31using log4net;
32using OpenSim.Framework; 32using OpenSim.Framework;
33using OpenSim.Framework.Client; 33using OpenSim.Framework.Client;
34using OpenSim.Framework.Communications.Cache;
35using OpenSim.Region.Framework.Interfaces; 34using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.Framework.Scenes.Types; 35using OpenSim.Region.Framework.Scenes.Types;
37 36
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
index 0ed00de..b775d27 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectBasicTests.cs
@@ -32,8 +32,7 @@ using NUnit.Framework.SyntaxHelpers;
32using OpenMetaverse; 32using OpenMetaverse;
33using OpenSim.Framework; 33using OpenSim.Framework;
34using OpenSim.Framework.Communications; 34using OpenSim.Framework.Communications;
35using OpenSim.Framework.Communications.Cache; 35
36using OpenSim.Region.Communications.Local;
37using OpenSim.Region.Framework.Scenes; 36using OpenSim.Region.Framework.Scenes;
38using OpenSim.Tests.Common; 37using OpenSim.Tests.Common;
39using OpenSim.Tests.Common.Mock; 38using OpenSim.Tests.Common.Mock;
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
index 709cca2..0b7608d 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneObjectLinkingTests.cs
@@ -32,8 +32,7 @@ using NUnit.Framework.SyntaxHelpers;
32using OpenMetaverse; 32using OpenMetaverse;
33using OpenSim.Framework; 33using OpenSim.Framework;
34using OpenSim.Framework.Communications; 34using OpenSim.Framework.Communications;
35using OpenSim.Framework.Communications.Cache; 35
36using OpenSim.Region.Communications.Local;
37using OpenSim.Region.Framework.Scenes; 36using OpenSim.Region.Framework.Scenes;
38using OpenSim.Tests.Common; 37using OpenSim.Tests.Common;
39using OpenSim.Tests.Common.Mock; 38using OpenSim.Tests.Common.Mock;
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
index f00dd66..501207e 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
@@ -40,8 +40,8 @@ using OpenSim.Framework;
40using OpenSim.Framework.Communications; 40using OpenSim.Framework.Communications;
41using OpenSim.Region.Framework.Scenes; 41using OpenSim.Region.Framework.Scenes;
42using OpenSim.Region.Framework.Interfaces; 42using OpenSim.Region.Framework.Interfaces;
43using OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion;
44using OpenSim.Region.CoreModules.World.Serialiser; 43using OpenSim.Region.CoreModules.World.Serialiser;
44using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
45using OpenSim.Tests.Common; 45using OpenSim.Tests.Common;
46using OpenSim.Tests.Common.Mock; 46using OpenSim.Tests.Common.Mock;
47using OpenSim.Tests.Common.Setup; 47using OpenSim.Tests.Common.Setup;
@@ -58,7 +58,6 @@ namespace OpenSim.Region.Framework.Scenes.Tests
58 public UUID agent1, agent2, agent3; 58 public UUID agent1, agent2, agent3;
59 public static Random random; 59 public static Random random;
60 public ulong region1,region2,region3; 60 public ulong region1,region2,region3;
61 public TestCommunicationsManager cm;
62 public AgentCircuitData acd1; 61 public AgentCircuitData acd1;
63 public SceneObjectGroup sog1, sog2, sog3; 62 public SceneObjectGroup sog1, sog2, sog3;
64 public TestClient testclient; 63 public TestClient testclient;
@@ -66,12 +65,11 @@ namespace OpenSim.Region.Framework.Scenes.Tests
66 [TestFixtureSetUp] 65 [TestFixtureSetUp]
67 public void Init() 66 public void Init()
68 { 67 {
69 cm = new TestCommunicationsManager(); 68 scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000);
70 scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000, cm); 69 scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000);
71 scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000, cm); 70 scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000);
72 scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000, cm);
73 71
74 ISharedRegionModule interregionComms = new RESTInterregionComms(); 72 ISharedRegionModule interregionComms = new LocalSimulationConnectorModule();
75 interregionComms.Initialise(new IniConfigSource()); 73 interregionComms.Initialise(new IniConfigSource());
76 interregionComms.PostInitialise(); 74 interregionComms.PostInitialise();
77 SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms); 75 SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms);
@@ -373,7 +371,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
373 371
374 Assert.That(presence.HasAttachments(), Is.False, "Presence has attachments before cross"); 372 Assert.That(presence.HasAttachments(), Is.False, "Presence has attachments before cross");
375 373
376 Assert.That(presence2.CrossAttachmentsIntoNewRegion(region1, true), Is.True, "Cross was not successful"); 374 //Assert.That(presence2.CrossAttachmentsIntoNewRegion(region1, true), Is.True, "Cross was not successful");
377 Assert.That(presence2.HasAttachments(), Is.False, "Presence2 objects were not deleted"); 375 Assert.That(presence2.HasAttachments(), Is.False, "Presence2 objects were not deleted");
378 Assert.That(presence.HasAttachments(), Is.True, "Presence has not received new objects"); 376 Assert.That(presence.HasAttachments(), Is.True, "Presence has not received new objects");
379 } 377 }
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
index 8a27b7b..c77220c 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
@@ -132,7 +132,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
132 RegionInfo regionInfo = new RegionInfo(0,0,null,null); 132 RegionInfo regionInfo = new RegionInfo(0,0,null,null);
133 FakeStorageManager storageManager = new FakeStorageManager(); 133 FakeStorageManager storageManager = new FakeStorageManager();
134 134
135 new Scene(regionInfo, null, null, null, storageManager, null, false, false, false, null, null); 135 new Scene(regionInfo, null, null, storageManager, null, false, false, false, null, null);
136 } 136 }
137 } 137 }
138} 138}
diff --git a/OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs b/OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs
index b46eb8e..cafe48a 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/StandaloneTeleportTests.cs
@@ -34,7 +34,7 @@ using OpenMetaverse;
34using OpenSim.Framework; 34using OpenSim.Framework;
35using OpenSim.Framework.Communications; 35using OpenSim.Framework.Communications;
36using OpenSim.Region.Framework.Interfaces; 36using OpenSim.Region.Framework.Interfaces;
37using OpenSim.Region.CoreModules.ServiceConnectorsOut.Interregion; 37using OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation;
38using OpenSim.Tests.Common; 38using OpenSim.Tests.Common;
39using OpenSim.Tests.Common.Mock; 39using OpenSim.Tests.Common.Mock;
40using OpenSim.Tests.Common.Setup; 40using OpenSim.Tests.Common.Setup;
@@ -113,17 +113,16 @@ namespace OpenSim.Region.Framework.Scenes.Tests
113 113
114 UUID sceneAId = UUID.Parse("00000000-0000-0000-0000-000000000100"); 114 UUID sceneAId = UUID.Parse("00000000-0000-0000-0000-000000000100");
115 UUID sceneBId = UUID.Parse("00000000-0000-0000-0000-000000000200"); 115 UUID sceneBId = UUID.Parse("00000000-0000-0000-0000-000000000200");
116 TestCommunicationsManager cm = new TestCommunicationsManager();
117 116
118 // shared module 117 // shared module
119 ISharedRegionModule interregionComms = new RESTInterregionComms(); 118 ISharedRegionModule interregionComms = new LocalSimulationConnectorModule();
120 119
121 120
122 Scene sceneB = SceneSetupHelpers.SetupScene("sceneB", sceneBId, 1010, 1010, cm, "grid"); 121 Scene sceneB = SceneSetupHelpers.SetupScene("sceneB", sceneBId, 1010, 1010, "grid");
123 SceneSetupHelpers.SetupSceneModules(sceneB, new IniConfigSource(), interregionComms); 122 SceneSetupHelpers.SetupSceneModules(sceneB, new IniConfigSource(), interregionComms);
124 sceneB.RegisterRegionWithGrid(); 123 sceneB.RegisterRegionWithGrid();
125 124
126 Scene sceneA = SceneSetupHelpers.SetupScene("sceneA", sceneAId, 1000, 1000, cm, "grid"); 125 Scene sceneA = SceneSetupHelpers.SetupScene("sceneA", sceneAId, 1000, 1000, "grid");
127 SceneSetupHelpers.SetupSceneModules(sceneA, new IniConfigSource(), interregionComms); 126 SceneSetupHelpers.SetupSceneModules(sceneA, new IniConfigSource(), interregionComms);
128 sceneA.RegisterRegionWithGrid(); 127 sceneA.RegisterRegionWithGrid();
129 128