aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs2
-rw-r--r--OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs2
-rw-r--r--OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs72
-rw-r--r--OpenSim/Region/Communications/Hypergrid/HGUserServices.cs4
-rw-r--r--OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs12
-rw-r--r--OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs62
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs6
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs4
-rw-r--r--OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs395
-rw-r--r--OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs36
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs317
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs76
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs23
13 files changed, 895 insertions, 116 deletions
diff --git a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs
index 381070e..80f2e79 100644
--- a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs
+++ b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsGridMode.cs
@@ -59,7 +59,7 @@ namespace OpenSim.Region.Communications.Hypergrid
59 HGUserServices userServices = new HGUserServices(this); 59 HGUserServices userServices = new HGUserServices(this);
60 // This plugin arrangement could eventually be configurable rather than hardcoded here. 60 // This plugin arrangement could eventually be configurable rather than hardcoded here.
61 userServices.AddPlugin(new TemporaryUserProfilePlugin()); 61 userServices.AddPlugin(new TemporaryUserProfilePlugin());
62 userServices.AddPlugin(new OGS1UserDataPlugin(this)); 62 userServices.AddPlugin(new HGUserDataPlugin(this, userServices));
63 63
64 m_userService = userServices; 64 m_userService = userServices;
65 m_messageService = userServices; 65 m_messageService = userServices;
diff --git a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs
index 568437d..e4e12d4 100644
--- a/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs
+++ b/OpenSim/Region/Communications/Hypergrid/HGCommunicationsStandalone.cs
@@ -57,7 +57,7 @@ namespace OpenSim.Region.Communications.Hypergrid
57 HGUserServices hgUserService = new HGUserServices(this, localUserService); 57 HGUserServices hgUserService = new HGUserServices(this, localUserService);
58 // This plugin arrangement could eventually be configurable rather than hardcoded here. 58 // This plugin arrangement could eventually be configurable rather than hardcoded here.
59 hgUserService.AddPlugin(new TemporaryUserProfilePlugin()); 59 hgUserService.AddPlugin(new TemporaryUserProfilePlugin());
60 hgUserService.AddPlugin(new OGS1UserDataPlugin(this)); 60 hgUserService.AddPlugin(new HGUserDataPlugin(this, hgUserService));
61 61
62 m_userService = hgUserService; 62 m_userService = hgUserService;
63 m_userAdminService = hgUserService; 63 m_userAdminService = hgUserService;
diff --git a/OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs b/OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs
new file mode 100644
index 0000000..4b8fc26
--- /dev/null
+++ b/OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs
@@ -0,0 +1,72 @@
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;
30using System.Collections.Generic;
31using System.Net;
32using System.Reflection;
33using System.Text.RegularExpressions;
34using System.Xml.Serialization;
35using log4net;
36using Nwc.XmlRpc;
37using OpenMetaverse;
38using OpenSim.Data;
39using OpenSim.Framework;
40using OpenSim.Framework.Communications;
41using OpenSim.Framework.Communications.Clients;
42using OpenSim.Region.Communications.OGS1;
43
44namespace OpenSim.Region.Communications.Hypergrid
45{
46 public class HGUserDataPlugin : OGS1UserDataPlugin
47 {
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49
50 HGUserServices m_UserServices;
51
52 public HGUserDataPlugin()
53 {
54 }
55
56 public HGUserDataPlugin(CommunicationsManager commsManager, HGUserServices userServices)
57 {
58 m_log.DebugFormat("[HG USER SERVICES]: {0} initialized", Name);
59 m_commsManager = commsManager;
60 m_UserServices = userServices;
61 }
62
63 protected override string GetUserServerURL(UUID userID)
64 {
65 string url = string.Empty;
66 if (m_UserServices.IsForeignUser(userID, out url))
67 return url;
68 return m_commsManager.NetworkServersInfo.UserURL;
69 }
70
71 }
72}
diff --git a/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs b/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs
index 68a9076..f1a56ef 100644
--- a/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs
+++ b/OpenSim/Region/Communications/Hypergrid/HGUserServices.cs
@@ -311,9 +311,9 @@ namespace OpenSim.Region.Communications.Hypergrid
311 return m_commsManager.NetworkServersInfo.UserURL; 311 return m_commsManager.NetworkServersInfo.UserURL;
312 } 312 }
313 313
314 private bool IsForeignUser(UUID userID, out string userServerURL) 314 public bool IsForeignUser(UUID userID, out string userServerURL)
315 { 315 {
316 userServerURL = string.Empty; 316 userServerURL = m_commsManager.NetworkServersInfo.UserURL;
317 CachedUserInfo uinfo = m_commsManager.UserProfileCacheService.GetUserDetails(userID); 317 CachedUserInfo uinfo = m_commsManager.UserProfileCacheService.GetUserDetails(userID);
318 if (uinfo != null) 318 if (uinfo != null)
319 { 319 {
diff --git a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs b/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs
index 9f234be..ec8512a 100644
--- a/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs
+++ b/OpenSim/Region/Communications/OGS1/OGS1UserDataPlugin.cs
@@ -48,6 +48,10 @@ namespace OpenSim.Region.Communications.OGS1
48 48
49 protected CommunicationsManager m_commsManager; 49 protected CommunicationsManager m_commsManager;
50 50
51 public OGS1UserDataPlugin()
52 {
53 }
54
51 public OGS1UserDataPlugin(CommunicationsManager commsManager) 55 public OGS1UserDataPlugin(CommunicationsManager commsManager)
52 { 56 {
53 m_log.DebugFormat("[OGS1 USER SERVICES]: {0} initialized", Name); 57 m_log.DebugFormat("[OGS1 USER SERVICES]: {0} initialized", Name);
@@ -108,7 +112,7 @@ namespace OpenSim.Region.Communications.OGS1
108 parameters.Add(param); 112 parameters.Add(param);
109 XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters); 113 XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters);
110 114
111 XmlRpcResponse resp = req.Send(GetUserServerURL(userId), 6000); 115 XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 6000);
112 Hashtable respData = (Hashtable)resp.Value; 116 Hashtable respData = (Hashtable)resp.Value;
113 if (respData.Contains("error_type")) 117 if (respData.Contains("error_type"))
114 { 118 {
@@ -603,7 +607,7 @@ namespace OpenSim.Region.Communications.OGS1
603 { 607 {
604 if ((string)respData["returnString"] == "TRUE") 608 if ((string)respData["returnString"] == "TRUE")
605 { 609 {
606 610 m_log.DebugFormat("[OGS1 USER SERVICES]: Updated user appearance in {0}", GetUserServerURL(user));
607 } 611 }
608 else 612 else
609 { 613 {
@@ -622,8 +626,8 @@ namespace OpenSim.Region.Communications.OGS1
622 } 626 }
623 catch (WebException e) 627 catch (WebException e)
624 { 628 {
625 m_log.Warn("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance: " + 629 m_log.WarnFormat("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance in {0}: {1}",
626 e.Message); 630 GetUserServerURL(user), e.Message);
627 // Return Empty list (no friends) 631 // Return Empty list (no friends)
628 } 632 }
629 } 633 }
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
index a5894c6..613dbe9 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
@@ -34,6 +34,7 @@ using System.Text.RegularExpressions;
34using log4net; 34using log4net;
35using Nini.Config; 35using Nini.Config;
36using OpenMetaverse; 36using OpenMetaverse;
37using Nwc.XmlRpc;
37using OpenSim.Framework; 38using OpenSim.Framework;
38using OpenSim.Framework.Communications; 39using OpenSim.Framework.Communications;
39using OpenSim.Framework.Communications.Services; 40using OpenSim.Framework.Communications.Services;
@@ -115,6 +116,8 @@ namespace OpenSim.Region.CoreModules.Hypergrid
115 116
116 httpServer.AddXmlRPCHandler("hg_login", m_loginService.XmlRpcLoginMethod); 117 httpServer.AddXmlRPCHandler("hg_login", m_loginService.XmlRpcLoginMethod);
117 httpServer.AddXmlRPCHandler("check_auth_session", m_loginService.XmlRPCCheckAuthSession, false); 118 httpServer.AddXmlRPCHandler("check_auth_session", m_loginService.XmlRPCCheckAuthSession, false);
119 httpServer.AddXmlRPCHandler("get_avatar_appearance", XmlRPCGetAvatarAppearance);
120 httpServer.AddXmlRPCHandler("update_avatar_appearance", XmlRPCUpdateAvatarAppearance);
118 121
119 } 122 }
120 } 123 }
@@ -256,5 +259,64 @@ namespace OpenSim.Region.CoreModules.Hypergrid
256 scene = null; 259 scene = null;
257 return false; 260 return false;
258 } 261 }
262
263 public XmlRpcResponse XmlRPCGetAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient)
264 {
265 XmlRpcResponse response = new XmlRpcResponse();
266 Hashtable requestData = (Hashtable)request.Params[0];
267 AvatarAppearance appearance;
268 Hashtable responseData;
269 if (requestData.Contains("owner"))
270 {
271 appearance = m_firstScene.CommsManager.AvatarService.GetUserAppearance(new UUID((string)requestData["owner"]));
272 if (appearance == null)
273 {
274 responseData = new Hashtable();
275 responseData["error_type"] = "no appearance";
276 responseData["error_desc"] = "There was no appearance found for this avatar";
277 }
278 else
279 {
280 responseData = appearance.ToHashTable();
281 }
282 }
283 else
284 {
285 responseData = new Hashtable();
286 responseData["error_type"] = "unknown_avatar";
287 responseData["error_desc"] = "The avatar appearance requested is not in the database";
288 }
289
290 response.Value = responseData;
291 return response;
292 }
293
294 public XmlRpcResponse XmlRPCUpdateAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient)
295 {
296 XmlRpcResponse response = new XmlRpcResponse();
297 Hashtable requestData = (Hashtable)request.Params[0];
298 Hashtable responseData;
299 if (requestData.Contains("owner"))
300 {
301 AvatarAppearance appearance = new AvatarAppearance(requestData);
302
303 // TODO: Sometime in the future we may have a database layer that is capable of updating appearance when
304 // the TextureEntry is null. When that happens, this check can be removed
305 if (appearance.Texture != null)
306 m_firstScene.CommsManager.AvatarService.UpdateUserAppearance(new UUID((string)requestData["owner"]), appearance);
307
308 responseData = new Hashtable();
309 responseData["returnString"] = "TRUE";
310 }
311 else
312 {
313 responseData = new Hashtable();
314 responseData["error_type"] = "unknown_avatar";
315 responseData["error_desc"] = "The avatar appearance requested is not in the database";
316 }
317 response.Value = responseData;
318 return response;
319 }
259 } 320 }
321
260} 322}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs
index fcd0304..cca5bb4 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/LocalUserServiceConnector.cs
@@ -42,7 +42,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
42 LogManager.GetLogger( 42 LogManager.GetLogger(
43 MethodBase.GetCurrentMethod().DeclaringType); 43 MethodBase.GetCurrentMethod().DeclaringType);
44 44
45 private IUserAccountDataService m_UserService; 45 private IUserAccountService m_UserService;
46 46
47 private bool m_Enabled = false; 47 private bool m_Enabled = false;
48 48
@@ -82,7 +82,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
82 82
83 Object[] args = new Object[] { source }; 83 Object[] args = new Object[] { source };
84 m_UserService = 84 m_UserService =
85 ServerUtils.LoadPlugin<IUserAccountDataService>(serviceDll, 85 ServerUtils.LoadPlugin<IUserAccountService>(serviceDll,
86 args); 86 args);
87 87
88 if (m_UserService == null) 88 if (m_UserService == null)
@@ -113,7 +113,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
113 if (!m_Enabled) 113 if (!m_Enabled)
114 return; 114 return;
115 115
116 scene.RegisterModuleInterface<IUserAccountDataService>(m_UserService); 116 scene.RegisterModuleInterface<IUserAccountService>(m_UserService);
117 } 117 }
118 118
119 public void RemoveRegion(Scene scene) 119 public void RemoveRegion(Scene scene)
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs
index a2b854b..cef9129 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/User/RemoteUserServiceConnector.cs
@@ -37,7 +37,7 @@ using OpenSim.Services.Connectors;
37namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User 37namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
38{ 38{
39 public class RemoteUserServicesConnector : UserServicesConnector, 39 public class RemoteUserServicesConnector : UserServicesConnector,
40 ISharedRegionModule, IUserAccountDataService 40 ISharedRegionModule, IUserAccountService
41 { 41 {
42 private static readonly ILog m_log = 42 private static readonly ILog m_log =
43 LogManager.GetLogger( 43 LogManager.GetLogger(
@@ -96,7 +96,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
96 if (!m_Enabled) 96 if (!m_Enabled)
97 return; 97 return;
98 98
99 scene.RegisterModuleInterface<IUserAccountDataService>(this); 99 scene.RegisterModuleInterface<IUserAccountService>(this);
100 } 100 }
101 101
102 public void RemoveRegion(Scene scene) 102 public void RemoveRegion(Scene scene)
diff --git a/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs b/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
index 5c5f164..9da869c 100644
--- a/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/RegionCombinerModule.cs
@@ -32,6 +32,7 @@ using log4net;
32using Nini.Config; 32using Nini.Config;
33using OpenMetaverse; 33using OpenMetaverse;
34using OpenSim.Framework; 34using OpenSim.Framework;
35using OpenSim.Framework.Client;
35using OpenSim.Region.Framework.Interfaces; 36using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.Framework.Scenes; 37using OpenSim.Region.Framework.Scenes;
37 38
@@ -71,6 +72,18 @@ namespace OpenSim.Region.CoreModules.World.Land
71 public void AddRegion(Scene scene) 72 public void AddRegion(Scene scene)
72 { 73 {
73 74
75
76
77 }
78
79 public void RemoveRegion(Scene scene)
80 {
81
82
83 }
84
85 public void RegionLoaded(Scene scene)
86 {
74 if (!enabledYN) 87 if (!enabledYN)
75 return; 88 return;
76 89
@@ -295,8 +308,8 @@ namespace OpenSim.Region.CoreModules.World.Land
295 m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}", 308 m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}",
296 conn.RegionScene.RegionInfo.RegionName, 309 conn.RegionScene.RegionInfo.RegionName,
297 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); 310 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
298 311
299 312
300 scene.BordersLocked = true; 313 scene.BordersLocked = true;
301 conn.RegionScene.BordersLocked = true; 314 conn.RegionScene.BordersLocked = true;
302 315
@@ -325,9 +338,11 @@ namespace OpenSim.Region.CoreModules.World.Land
325 // 338 //
326 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised()); 339 scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
327 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 340 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
328 341
329 conn.RegionScene.BordersLocked = false; 342 conn.RegionScene.BordersLocked = false;
330 scene.BordersLocked = false; 343 scene.BordersLocked = false;
344 if (conn.ClientEventForwarder != null)
345 conn.ClientEventForwarder.AddSceneToEventForwarding(scene);
331 connectedYN = true; 346 connectedYN = true;
332 break; 347 break;
333 } 348 }
@@ -367,7 +382,7 @@ namespace OpenSim.Region.CoreModules.World.Land
367 m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}", 382 m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}",
368 conn.RegionScene.RegionInfo.RegionName, 383 conn.RegionScene.RegionInfo.RegionName,
369 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); 384 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
370 conn.RegionScene.PhysicsScene.Combine(null,Vector3.Zero,extents); 385 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
371 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); 386 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
372 387
373 lock (conn.RegionScene.NorthBorders) 388 lock (conn.RegionScene.NorthBorders)
@@ -386,7 +401,8 @@ namespace OpenSim.Region.CoreModules.World.Land
386 401
387 scene.BordersLocked = false; 402 scene.BordersLocked = false;
388 conn.RegionScene.BordersLocked = false; 403 conn.RegionScene.BordersLocked = false;
389 404 if (conn.ClientEventForwarder != null)
405 conn.ClientEventForwarder.AddSceneToEventForwarding(scene);
390 connectedYN = true; 406 connectedYN = true;
391 break; 407 break;
392 } 408 }
@@ -424,52 +440,52 @@ namespace OpenSim.Region.CoreModules.World.Land
424 m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}", 440 m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}",
425 conn.RegionScene.RegionInfo.RegionName, 441 conn.RegionScene.RegionInfo.RegionName,
426 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents); 442 regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
427 443
428 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents); 444 conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
429 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero); 445 scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
430 lock (conn.RegionScene.NorthBorders) 446 lock (conn.RegionScene.NorthBorders)
431 if (conn.RegionScene.NorthBorders.Count == 1)// && 2) 447 if (conn.RegionScene.NorthBorders.Count == 1)// && 2)
432 { 448 {
433 //compound border 449 //compound border
434 // already locked above 450 // already locked above
435 conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; 451 conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize;
436 452
437 lock (conn.RegionScene.EastBorders) 453 lock (conn.RegionScene.EastBorders)
438 conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; 454 conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize;
439 lock (conn.RegionScene.WestBorders) 455 lock (conn.RegionScene.WestBorders)
440 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; 456 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
441 457
442
443 458
444 } 459
460 }
445 lock (scene.SouthBorders) 461 lock (scene.SouthBorders)
446 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south 462 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south
447 463
448 lock (conn.RegionScene.EastBorders) 464 lock (conn.RegionScene.EastBorders)
449 if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2) 465 if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2)
450 { 466 {
451 467
452 conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize; 468 conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize;
453 lock (conn.RegionScene.NorthBorders) 469 lock (conn.RegionScene.NorthBorders)
454 conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize; 470 conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
455 lock (conn.RegionScene.SouthBorders) 471 lock (conn.RegionScene.SouthBorders)
456 conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize; 472 conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
457 473
458 474
459 } 475 }
460 476
461 lock (scene.WestBorders) 477 lock (scene.WestBorders)
462 scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West 478 scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West
463/* 479 /*
464 else 480 else
465 { 481 {
466 conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize; 482 conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize;
467 conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize; 483 conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize;
468 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize; 484 conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
469 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south 485 scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south
470 } 486 }
471*/ 487 */
472 488
473 489
474 // Reset Terrain.. since terrain normally loads first. 490 // Reset Terrain.. since terrain normally loads first.
475 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised()); 491 //conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
@@ -478,6 +494,9 @@ namespace OpenSim.Region.CoreModules.World.Land
478 scene.BordersLocked = false; 494 scene.BordersLocked = false;
479 conn.RegionScene.BordersLocked = false; 495 conn.RegionScene.BordersLocked = false;
480 496
497 if (conn.ClientEventForwarder != null)
498 conn.ClientEventForwarder.AddSceneToEventForwarding(scene);
499
481 connectedYN = true; 500 connectedYN = true;
482 501
483 //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents); 502 //scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents);
@@ -495,7 +514,8 @@ namespace OpenSim.Region.CoreModules.World.Land
495 rdata.RegionScene = scene; 514 rdata.RegionScene = scene;
496 regionConnections.RegionLandChannel = scene.LandChannel; 515 regionConnections.RegionLandChannel = scene.LandChannel;
497 516
498 RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata,scene.LandChannel,regionConnections.ConnectedRegions); 517 RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel,
518 regionConnections.ConnectedRegions);
499 scene.LandChannel = lnd; 519 scene.LandChannel = lnd;
500 lock (m_regions) 520 lock (m_regions)
501 { 521 {
@@ -504,24 +524,157 @@ namespace OpenSim.Region.CoreModules.World.Land
504 ForwardPermissionRequests(regionConnections, r.RegionScene); 524 ForwardPermissionRequests(regionConnections, r.RegionScene);
505 } 525 }
506 } 526 }
507 527
508 m_regions.Add(scene.RegionInfo.originRegionID,regionConnections); 528 regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections);
529 scene.EventManager.OnNewPresence += SetCourseLocationDelegate;
530 m_regions.Add(scene.RegionInfo.originRegionID, regionConnections);
531
509 } 532 }
510 533
511 } 534 }
512 AdjustLargeRegionBounds(); 535 AdjustLargeRegionBounds();
513
514 } 536 }
515 537
516 public void RemoveRegion(Scene scene) 538 private void SetCourseLocationDelegate(ScenePresence presence)
517 { 539 {
518 540 presence.SetSendCourseLocationMethod(SendCourseLocationUpdates);
519
520 } 541 }
521 542
522 public void RegionLoaded(Scene scene) 543 private void SendCourseLocationUpdates(UUID sceneId, ScenePresence presence)
523 { 544 {
545 RegionConnections connectiondata = null;
546 lock (m_regions)
547 {
548 if (m_regions.ContainsKey(sceneId))
549 connectiondata = m_regions[sceneId];
550 else
551 return;
552 }
553
554 List<ScenePresence> avatars = connectiondata.RegionScene.GetAvatars();
555 List<Vector3> CoarseLocations = new List<Vector3>();
556 List<UUID> AvatarUUIDs = new List<UUID>();
557 for (int i = 0; i < avatars.Count; i++)
558 {
559 if (avatars[i].UUID != presence.UUID)
560 {
561 if (avatars[i].ParentID != 0)
562 {
563 // sitting avatar
564 SceneObjectPart sop = connectiondata.RegionScene.GetSceneObjectPart(avatars[i].ParentID);
565 if (sop != null)
566 {
567 CoarseLocations.Add(sop.AbsolutePosition + avatars[i].AbsolutePosition);
568 AvatarUUIDs.Add(avatars[i].UUID);
569 }
570 else
571 {
572 // we can't find the parent.. ! arg!
573 CoarseLocations.Add(avatars[i].AbsolutePosition);
574 AvatarUUIDs.Add(avatars[i].UUID);
575 }
576 }
577 else
578 {
579 CoarseLocations.Add(avatars[i].AbsolutePosition);
580 AvatarUUIDs.Add(avatars[i].UUID);
581 }
582 }
583 }
584 DistributeCourseLocationUpdates(CoarseLocations, AvatarUUIDs, connectiondata, presence);
585 }
586
587 private void DistributeCourseLocationUpdates(List<Vector3> locations, List<UUID> uuids,
588 RegionConnections connectiondata, ScenePresence rootPresence)
589 {
590 RegionData[] rdata = connectiondata.ConnectedRegions.ToArray();
591 List<IClientAPI> clients = new List<IClientAPI>();
592 Dictionary<Vector2, RegionCourseLocationStruct> updates = new Dictionary<Vector2, RegionCourseLocationStruct>();
524 593
594
595 // Root Region entry
596 RegionCourseLocationStruct rootupdatedata = new RegionCourseLocationStruct();
597 rootupdatedata.Locations = new List<Vector3>();
598 rootupdatedata.Uuids = new List<UUID>();
599 rootupdatedata.Offset = Vector2.Zero;
600
601 rootupdatedata.UserAPI = rootPresence.ControllingClient;
602
603 if (rootupdatedata.UserAPI != null)
604 updates.Add(Vector2.Zero, rootupdatedata);
605
606 //Each Region needs an entry or we will end up with dead minimap dots
607 foreach (RegionData regiondata in rdata)
608 {
609 Vector2 offset = new Vector2(regiondata.Offset.X, regiondata.Offset.Y);
610 RegionCourseLocationStruct updatedata = new RegionCourseLocationStruct();
611 updatedata.Locations = new List<Vector3>();
612 updatedata.Uuids = new List<UUID>();
613 updatedata.Offset = offset;
614
615 if (offset == Vector2.Zero)
616 updatedata.UserAPI = rootPresence.ControllingClient;
617 else
618 updatedata.UserAPI = LocateUsersChildAgentIClientAPI(offset, rootPresence.UUID, rdata);
619
620 if (updatedata.UserAPI != null)
621 updates.Add(offset, updatedata);
622 }
623
624 // go over the locations and assign them to an IClientAPI
625 for (int i = 0; i < locations.Count;i++ )
626 //{locations[i]/(int) Constants.RegionSize;
627 {
628 Vector3 pPosition = new Vector3((int)locations[i].X / (int)Constants.RegionSize,
629 (int)locations[i].Y / (int)Constants.RegionSize, locations[i].Z);
630 Vector2 offset = new Vector2(pPosition.X*(int) Constants.RegionSize,
631 pPosition.Y*(int) Constants.RegionSize);
632
633 if (!updates.ContainsKey(offset))
634 {
635 // This shouldn't happen
636 RegionCourseLocationStruct updatedata = new RegionCourseLocationStruct();
637 updatedata.Locations = new List<Vector3>();
638 updatedata.Uuids = new List<UUID>();
639 updatedata.Offset = offset;
640
641 if (offset == Vector2.Zero)
642 updatedata.UserAPI = rootPresence.ControllingClient;
643 else
644 updatedata.UserAPI = LocateUsersChildAgentIClientAPI(offset, rootPresence.UUID, rdata);
645
646 updates.Add(offset,updatedata);
647
648 }
649
650 updates[offset].Locations.Add(locations[i]);
651 updates[offset].Uuids.Add(uuids[i]);
652
653 }
654
655 // Send out the CoarseLocationupdates from their respective client connection based on where the avatar is
656 foreach (Vector2 offset in updates.Keys)
657 {
658 if (updates[offset].UserAPI != null)
659 {
660 updates[offset].UserAPI.SendCoarseLocationUpdate(updates[offset].Uuids,updates[offset].Locations);
661 }
662 }
663
664 }
665
666 private IClientAPI LocateUsersChildAgentIClientAPI(Vector2 offset, UUID uUID, RegionData[] rdata)
667 {
668 IClientAPI returnclient = null;
669 foreach (RegionData r in rdata)
670 {
671 if (r.Offset.X == offset.X && r.Offset.Y == offset.Y)
672 {
673 return r.RegionScene.SceneGraph.GetControllingClient(uUID);
674 }
675 }
676
677 return returnclient;
525 } 678 }
526 679
527 public void PostInitialise() 680 public void PostInitialise()
@@ -529,6 +682,8 @@ namespace OpenSim.Region.CoreModules.World.Land
529 682
530 } 683 }
531 684
685
686
532 public void UnCombineRegion(RegionData rdata) 687 public void UnCombineRegion(RegionData rdata)
533 { 688 {
534 lock (m_regions) 689 lock (m_regions)
@@ -733,6 +888,7 @@ namespace OpenSim.Region.CoreModules.World.Land
733 public int YEnd; 888 public int YEnd;
734 public List<RegionData> ConnectedRegions; 889 public List<RegionData> ConnectedRegions;
735 public RegionCombinerPermissionModule PermissionModule; 890 public RegionCombinerPermissionModule PermissionModule;
891 public RegionCombinerClientEventForwarder ClientEventForwarder;
736 public void UpdateExtents(Vector3 extents) 892 public void UpdateExtents(Vector3 extents)
737 { 893 {
738 XEnd = (int)extents.X; 894 XEnd = (int)extents.X;
@@ -748,6 +904,13 @@ namespace OpenSim.Region.CoreModules.World.Land
748 public Vector3 Offset; 904 public Vector3 Offset;
749 905
750 } 906 }
907 struct RegionCourseLocationStruct
908 {
909 public List<Vector3> Locations;
910 public List<UUID> Uuids;
911 public IClientAPI UserAPI;
912 public Vector2 Offset;
913 }
751 914
752 public class RegionCombinerLargeLandChannel : ILandChannel 915 public class RegionCombinerLargeLandChannel : ILandChannel
753 { 916 {
@@ -759,7 +922,8 @@ namespace OpenSim.Region.CoreModules.World.Land
759 922
760 #region ILandChannel Members 923 #region ILandChannel Members
761 924
762 public RegionCombinerLargeLandChannel(RegionData regData, ILandChannel rootRegionLandChannel,List<RegionData> regionConnections) 925 public RegionCombinerLargeLandChannel(RegionData regData, ILandChannel rootRegionLandChannel,
926 List<RegionData> regionConnections)
763 { 927 {
764 RegData = regData; 928 RegData = regData;
765 RootRegionLandChannel = rootRegionLandChannel; 929 RootRegionLandChannel = rootRegionLandChannel;
@@ -790,7 +954,7 @@ namespace OpenSim.Region.CoreModules.World.Land
790 else 954 else
791 { 955 {
792 int offsetX = (x / (int)Constants.RegionSize); 956 int offsetX = (x / (int)Constants.RegionSize);
793 int offsetY = (x / (int)Constants.RegionSize); 957 int offsetY = (y / (int)Constants.RegionSize);
794 offsetX *= (int)Constants.RegionSize; 958 offsetX *= (int)Constants.RegionSize;
795 offsetY *= (int)Constants.RegionSize; 959 offsetY *= (int)Constants.RegionSize;
796 960
@@ -823,7 +987,7 @@ namespace OpenSim.Region.CoreModules.World.Land
823 else 987 else
824 { 988 {
825 int offsetX = (int)(x/(int) Constants.RegionSize); 989 int offsetX = (int)(x/(int) Constants.RegionSize);
826 int offsetY = (int)(x/(int) Constants.RegionSize); 990 int offsetY = (int)(y/(int) Constants.RegionSize);
827 offsetX *= (int) Constants.RegionSize; 991 offsetX *= (int) Constants.RegionSize;
828 offsetY *= (int) Constants.RegionSize; 992 offsetY *= (int) Constants.RegionSize;
829 993
@@ -886,6 +1050,7 @@ namespace OpenSim.Region.CoreModules.World.Land
886 m_rootScene = RootScene; 1050 m_rootScene = RootScene;
887 } 1051 }
888 1052
1053 #region Permission Override
889 public bool BypassPermissions() 1054 public bool BypassPermissions()
890 { 1055 {
891 return m_rootScene.Permissions.BypassPermissions(); 1056 return m_rootScene.Permissions.BypassPermissions();
@@ -1110,5 +1275,137 @@ namespace OpenSim.Region.CoreModules.World.Land
1110 { 1275 {
1111 return m_rootScene.Permissions.CanUseObjectReturn(landdata, type, client, retlist); 1276 return m_rootScene.Permissions.CanUseObjectReturn(landdata, type, client, retlist);
1112 } 1277 }
1278 #endregion
1279 }
1280
1281 public class RegionCombinerClientEventForwarder
1282 {
1283 private Scene m_rootScene;
1284 private Dictionary<UUID, Scene> m_virtScene = new Dictionary<UUID, Scene>();
1285 private Dictionary<UUID,RegionCombinerModuleIndividualForwarder> m_forwarders = new Dictionary<UUID,
1286 RegionCombinerModuleIndividualForwarder>();
1287 public RegionCombinerClientEventForwarder(RegionConnections rootScene)
1288 {
1289 m_rootScene = rootScene.RegionScene;
1290
1291
1292 }
1293
1294 public void AddSceneToEventForwarding( Scene virtualScene )
1295 {
1296 lock (m_virtScene)
1297 {
1298 if (m_virtScene.ContainsKey(virtualScene.RegionInfo.originRegionID))
1299 {
1300 m_virtScene[virtualScene.RegionInfo.originRegionID] = virtualScene;
1301 }
1302 else
1303 {
1304 m_virtScene.Add(virtualScene.RegionInfo.originRegionID, virtualScene);
1305 }
1306 }
1307
1308 lock (m_forwarders)
1309 {
1310 // TODO: Fix this to unregister if this happens
1311 if (m_forwarders.ContainsKey(virtualScene.RegionInfo.originRegionID))
1312 m_forwarders.Remove(virtualScene.RegionInfo.originRegionID);
1313
1314 RegionCombinerModuleIndividualForwarder forwarder =
1315 new RegionCombinerModuleIndividualForwarder(m_rootScene, virtualScene);
1316 m_forwarders.Add(virtualScene.RegionInfo.originRegionID, forwarder);
1317
1318 virtualScene.EventManager.OnNewClient += forwarder.ClientConnect;
1319 virtualScene.EventManager.OnClientClosed += forwarder.ClientClosed;
1320 }
1321 }
1322
1323 public void RemoveSceneFromEventForwarding (Scene virtualScene)
1324 {
1325 lock (m_forwarders)
1326 {
1327 RegionCombinerModuleIndividualForwarder forwarder = m_forwarders[virtualScene.RegionInfo.originRegionID];
1328 virtualScene.EventManager.OnNewClient -= forwarder.ClientConnect;
1329 virtualScene.EventManager.OnClientClosed -= forwarder.ClientClosed;
1330 m_forwarders.Remove(virtualScene.RegionInfo.originRegionID);
1331 }
1332 lock (m_virtScene)
1333 {
1334 if (m_virtScene.ContainsKey(virtualScene.RegionInfo.originRegionID))
1335 {
1336 m_virtScene.Remove(virtualScene.RegionInfo.originRegionID);
1337 }
1338 }
1339 }
1340 }
1341
1342 public class RegionCombinerModuleIndividualForwarder
1343 {
1344 private Scene m_rootScene;
1345 private Scene m_virtScene;
1346 public RegionCombinerModuleIndividualForwarder(Scene rootScene, Scene virtScene)
1347 {
1348 m_rootScene = rootScene;
1349 m_virtScene = virtScene;
1350 }
1351
1352 public void ClientConnect(IClientAPI client)
1353 {
1354
1355 m_virtScene.UnSubscribeToClientPrimEvents(client);
1356 m_virtScene.UnSubscribeToClientPrimRezEvents(client);
1357 m_virtScene.UnSubscribeToClientInventoryEvents(client);
1358 m_virtScene.UnSubscribeToClientAttachmentEvents(client);
1359 m_virtScene.UnSubscribeToClientTeleportEvents(client);
1360 m_virtScene.UnSubscribeToClientScriptEvents(client);
1361 m_virtScene.UnSubscribeToClientGodEvents(client);
1362 m_virtScene.UnSubscribeToClientNetworkEvents(client);
1363
1364 m_rootScene.SubscribeToClientPrimEvents(client);
1365 client.OnAddPrim += LocalAddNewPrim;
1366 client.OnRezObject += LocalRezObject;
1367 m_rootScene.SubscribeToClientInventoryEvents(client);
1368 m_rootScene.SubscribeToClientAttachmentEvents(client);
1369 m_rootScene.SubscribeToClientTeleportEvents(client);
1370 m_rootScene.SubscribeToClientScriptEvents(client);
1371 m_rootScene.SubscribeToClientGodEvents(client);
1372 m_rootScene.SubscribeToClientNetworkEvents(client);
1373 }
1374 public void ClientClosed(UUID clientid, Scene scene)
1375 {
1376
1377 }
1378
1379
1380 private void LocalRezObject(IClientAPI remoteclient, UUID itemid, Vector3 rayend, Vector3 raystart,
1381 UUID raytargetid, byte bypassraycast, bool rayendisintersection, bool rezselected, bool removeitem,
1382 UUID fromtaskid)
1383 {
1384 int differenceX = (int)m_virtScene.RegionInfo.RegionLocX - (int)m_rootScene.RegionInfo.RegionLocX;
1385 int differenceY = (int)m_virtScene.RegionInfo.RegionLocY - (int)m_rootScene.RegionInfo.RegionLocY;
1386 rayend.X += differenceX * (int)Constants.RegionSize;
1387 rayend.Y += differenceY * (int)Constants.RegionSize;
1388 raystart.X += differenceX * (int)Constants.RegionSize;
1389 raystart.Y += differenceY * (int)Constants.RegionSize;
1390
1391 m_rootScene.RezObject(remoteclient, itemid, rayend, raystart, raytargetid, bypassraycast,
1392 rayendisintersection, rezselected, removeitem, fromtaskid);
1393
1394 }
1395
1396 private void LocalAddNewPrim(UUID ownerid, UUID groupid, Vector3 rayend, Quaternion rot,
1397 PrimitiveBaseShape shape, byte bypassraycast, Vector3 raystart, UUID raytargetid,
1398 byte rayendisintersection)
1399 {
1400 int differenceX = (int)m_virtScene.RegionInfo.RegionLocX - (int)m_rootScene.RegionInfo.RegionLocX;
1401 int differenceY = (int)m_virtScene.RegionInfo.RegionLocY - (int)m_rootScene.RegionInfo.RegionLocY;
1402 rayend.X += differenceX * (int)Constants.RegionSize;
1403 rayend.Y += differenceY * (int)Constants.RegionSize;
1404 raystart.X += differenceX * (int)Constants.RegionSize;
1405 raystart.Y += differenceY * (int)Constants.RegionSize;
1406 m_rootScene.AddNewPrim(ownerid, groupid, rayend, rot, shape, bypassraycast, raystart, raytargetid,
1407 rayendisintersection);
1408
1409 }
1113 } 1410 }
1114} 1411}
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
index dd6928f..8fe3565 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGScene.Inventory.cs
@@ -113,26 +113,26 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
113 UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, 113 UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
114 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) 114 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
115 { 115 {
116 //m_log.DebugFormat("[HGScene] RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID); 116 m_log.DebugFormat("[HGScene] RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID);
117 117
118 if (fromTaskID.Equals(UUID.Zero)) 118 //if (fromTaskID.Equals(UUID.Zero))
119 //{
120 InventoryItemBase item = new InventoryItemBase(itemID);
121 item.Owner = remoteClient.AgentId;
122 item = InventoryService.GetItem(item);
123 //if (item == null)
124 //{ // Fetch the item
125 // item = new InventoryItemBase();
126 // item.Owner = remoteClient.AgentId;
127 // item.ID = itemID;
128 // item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo);
129 //}
130 if (item != null)
119 { 131 {
120 InventoryItemBase item = new InventoryItemBase(itemID); 132 m_assMapper.Get(item.AssetID, remoteClient.AgentId);
121 item.Owner = remoteClient.AgentId; 133
122 item = InventoryService.GetItem(item);
123 //if (item == null)
124 //{ // Fetch the item
125 // item = new InventoryItemBase();
126 // item.Owner = remoteClient.AgentId;
127 // item.ID = itemID;
128 // item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo);
129 //}
130 if (item != null)
131 {
132 m_assMapper.Get(item.AssetID, remoteClient.AgentId);
133
134 }
135 } 134 }
135 //}
136 136
137 // OK, we're done fetching. Pass it up to the default RezObject 137 // OK, we're done fetching. Pass it up to the default RezObject
138 return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, 138 return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection,
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 1d0da4c..3b91dd0 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -220,11 +220,12 @@ namespace OpenSim.Region.Framework.Scenes
220 private bool m_scripts_enabled = true; 220 private bool m_scripts_enabled = true;
221 private string m_defaultScriptEngine; 221 private string m_defaultScriptEngine;
222 private int m_LastLogin = 0; 222 private int m_LastLogin = 0;
223 private Thread HeartbeatThread; 223 private Thread HeartbeatThread = null;
224 private volatile bool shuttingdown = false; 224 private volatile bool shuttingdown = false;
225 225
226 private int m_lastUpdate = Environment.TickCount; 226 private int m_lastUpdate = Environment.TickCount;
227 private int m_maxPrimsPerFrame = 200; 227 private int m_maxPrimsPerFrame = 200;
228 private bool m_firstHeartbeat = true;
228 229
229 private object m_deleting_scene_object = new object(); 230 private object m_deleting_scene_object = new object();
230 231
@@ -876,6 +877,13 @@ namespace OpenSim.Region.Framework.Scenes
876 //m_heartbeatTimer.Enabled = true; 877 //m_heartbeatTimer.Enabled = true;
877 //m_heartbeatTimer.Interval = (int)(m_timespan * 1000); 878 //m_heartbeatTimer.Interval = (int)(m_timespan * 1000);
878 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat); 879 //m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
880 if (HeartbeatThread != null)
881 {
882 ThreadTracker.Remove(HeartbeatThread);
883 HeartbeatThread.Abort();
884 HeartbeatThread = null;
885 }
886 m_lastUpdate = Environment.TickCount;
879 HeartbeatThread = new Thread(new ParameterizedThreadStart(Heartbeat)); 887 HeartbeatThread = new Thread(new ParameterizedThreadStart(Heartbeat));
880 HeartbeatThread.SetApartmentState(ApartmentState.MTA); 888 HeartbeatThread.SetApartmentState(ApartmentState.MTA);
881 HeartbeatThread.Name = string.Format("Heartbeat for region {0}", RegionInfo.RegionName); 889 HeartbeatThread.Name = string.Format("Heartbeat for region {0}", RegionInfo.RegionName);
@@ -912,9 +920,16 @@ namespace OpenSim.Region.Framework.Scenes
912 /// <param name="e"></param> 920 /// <param name="e"></param>
913 private void Heartbeat(object sender) 921 private void Heartbeat(object sender)
914 { 922 {
915 Update(); 923 try
924 {
925 Update();
916 926
917 m_lastUpdate = Environment.TickCount; 927 m_lastUpdate = Environment.TickCount;
928 m_firstHeartbeat = false;
929 }
930 catch (ThreadAbortException)
931 {
932 }
918 } 933 }
919 934
920 /// <summary> 935 /// <summary>
@@ -2307,6 +2322,7 @@ namespace OpenSim.Region.Framework.Scenes
2307 /// <param name="client"></param> 2322 /// <param name="client"></param>
2308 public override void AddNewClient(IClientAPI client) 2323 public override void AddNewClient(IClientAPI client)
2309 { 2324 {
2325 CheckHeartbeat();
2310 SubscribeToClientEvents(client); 2326 SubscribeToClientEvents(client);
2311 ScenePresence presence; 2327 ScenePresence presence;
2312 2328
@@ -2365,14 +2381,40 @@ namespace OpenSim.Region.Framework.Scenes
2365 EventManager.TriggerOnNewClient(client); 2381 EventManager.TriggerOnNewClient(client);
2366 } 2382 }
2367 2383
2384
2385
2368 /// <summary> 2386 /// <summary>
2369 /// Register for events from the client 2387 /// Register for events from the client
2370 /// </summary> 2388 /// </summary>
2371 /// <param name="client">The IClientAPI of the connected client</param> 2389 /// <param name="client">The IClientAPI of the connected client</param>
2372 protected virtual void SubscribeToClientEvents(IClientAPI client) 2390 public virtual void SubscribeToClientEvents(IClientAPI client)
2391 {
2392 SubscribeToClientTerrainEvents(client);
2393 SubscribeToClientPrimEvents(client);
2394 SubscribeToClientPrimRezEvents(client);
2395 SubscribeToClientInventoryEvents(client);
2396 SubscribeToClientAttachmentEvents(client);
2397 SubscribeToClientTeleportEvents(client);
2398 SubscribeToClientScriptEvents(client);
2399 SubscribeToClientParcelEvents(client);
2400 SubscribeToClientGridEvents(client);
2401 SubscribeToClientGodEvents(client);
2402
2403 SubscribeToClientNetworkEvents(client);
2404
2405
2406 // EventManager.TriggerOnNewClient(client);
2407 }
2408
2409 public virtual void SubscribeToClientTerrainEvents(IClientAPI client)
2373 { 2410 {
2374 client.OnRegionHandShakeReply += SendLayerData; 2411 client.OnRegionHandShakeReply += SendLayerData;
2375 client.OnAddPrim += AddNewPrim; 2412 client.OnUnackedTerrain += TerrainUnAcked;
2413 }
2414
2415 public virtual void SubscribeToClientPrimEvents(IClientAPI client)
2416 {
2417
2376 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimPosition; 2418 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimPosition;
2377 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; 2419 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition;
2378 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimRotation; 2420 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimRotation;
@@ -2384,8 +2426,6 @@ namespace OpenSim.Region.Framework.Scenes
2384 client.OnUpdateExtraParams += m_sceneGraph.UpdateExtraParam; 2426 client.OnUpdateExtraParams += m_sceneGraph.UpdateExtraParam;
2385 client.OnUpdatePrimShape += m_sceneGraph.UpdatePrimShape; 2427 client.OnUpdatePrimShape += m_sceneGraph.UpdatePrimShape;
2386 client.OnUpdatePrimTexture += m_sceneGraph.UpdatePrimTexture; 2428 client.OnUpdatePrimTexture += m_sceneGraph.UpdatePrimTexture;
2387 client.OnTeleportLocationRequest += RequestTeleportLocation;
2388 client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
2389 client.OnObjectRequest += RequestPrim; 2429 client.OnObjectRequest += RequestPrim;
2390 client.OnObjectSelect += SelectPrim; 2430 client.OnObjectSelect += SelectPrim;
2391 client.OnObjectDeselect += DeselectPrim; 2431 client.OnObjectDeselect += DeselectPrim;
@@ -2393,15 +2433,7 @@ namespace OpenSim.Region.Framework.Scenes
2393 client.OnSpinStart += m_sceneGraph.SpinStart; 2433 client.OnSpinStart += m_sceneGraph.SpinStart;
2394 client.OnSpinUpdate += m_sceneGraph.SpinObject; 2434 client.OnSpinUpdate += m_sceneGraph.SpinObject;
2395 client.OnDeRezObject += DeRezObject; 2435 client.OnDeRezObject += DeRezObject;
2396 client.OnRezObject += RezObject; 2436
2397 client.OnRezSingleAttachmentFromInv += RezSingleAttachment;
2398 client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments;
2399 client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv;
2400 client.OnObjectAttach += m_sceneGraph.AttachObject;
2401 client.OnObjectDetach += m_sceneGraph.DetachObject;
2402 client.OnObjectDrop += m_sceneGraph.DropObject;
2403 client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest;
2404 client.OnObjectDescription += m_sceneGraph.PrimDescription;
2405 client.OnObjectName += m_sceneGraph.PrimName; 2437 client.OnObjectName += m_sceneGraph.PrimName;
2406 client.OnObjectClickAction += m_sceneGraph.PrimClickAction; 2438 client.OnObjectClickAction += m_sceneGraph.PrimClickAction;
2407 client.OnObjectMaterial += m_sceneGraph.PrimMaterial; 2439 client.OnObjectMaterial += m_sceneGraph.PrimMaterial;
@@ -2412,7 +2444,24 @@ namespace OpenSim.Region.Framework.Scenes
2412 client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; 2444 client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags;
2413 client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily; 2445 client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily;
2414 client.OnObjectPermissions += HandleObjectPermissionsUpdate; 2446 client.OnObjectPermissions += HandleObjectPermissionsUpdate;
2447 client.OnGrabObject += ProcessObjectGrab;
2448 client.OnDeGrabObject += ProcessObjectDeGrab;
2449 client.OnUndo += m_sceneGraph.HandleUndo;
2450 client.OnObjectDescription += m_sceneGraph.PrimDescription;
2451 client.OnObjectDrop += m_sceneGraph.DropObject;
2452 client.OnObjectSaleInfo += ObjectSaleInfo;
2453 client.OnObjectIncludeInSearch += m_sceneGraph.MakeObjectSearchable;
2454 client.OnObjectOwner += ObjectOwner;
2455 }
2456
2457 public virtual void SubscribeToClientPrimRezEvents(IClientAPI client)
2458 {
2459 client.OnAddPrim += AddNewPrim;
2460 client.OnRezObject += RezObject;
2461 }
2415 2462
2463 public virtual void SubscribeToClientInventoryEvents(IClientAPI client)
2464 {
2416 client.OnCreateNewInventoryItem += CreateNewInventoryItem; 2465 client.OnCreateNewInventoryItem += CreateNewInventoryItem;
2417 client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder; 2466 client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder;
2418 client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder; 2467 client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder;
@@ -2430,36 +2479,217 @@ namespace OpenSim.Region.Framework.Scenes
2430 client.OnRemoveTaskItem += RemoveTaskInventory; 2479 client.OnRemoveTaskItem += RemoveTaskInventory;
2431 client.OnUpdateTaskInventory += UpdateTaskInventory; 2480 client.OnUpdateTaskInventory += UpdateTaskInventory;
2432 client.OnMoveTaskItem += ClientMoveTaskInventoryItem; 2481 client.OnMoveTaskItem += ClientMoveTaskInventoryItem;
2482 }
2433 2483
2434 client.OnGrabObject += ProcessObjectGrab; 2484 public virtual void SubscribeToClientAttachmentEvents(IClientAPI client)
2435 client.OnDeGrabObject += ProcessObjectDeGrab; 2485 {
2436 client.OnMoneyTransferRequest += ProcessMoneyTransferRequest; 2486 client.OnRezSingleAttachmentFromInv += RezSingleAttachment;
2437 client.OnParcelBuy += ProcessParcelBuy; 2487 client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments;
2438 client.OnAvatarPickerRequest += ProcessAvatarPickerRequest; 2488 client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv;
2439 client.OnObjectIncludeInSearch += m_sceneGraph.MakeObjectSearchable; 2489 client.OnObjectAttach += m_sceneGraph.AttachObject;
2490 client.OnObjectDetach += m_sceneGraph.DetachObject;
2491 }
2492
2493 public virtual void SubscribeToClientTeleportEvents(IClientAPI client)
2494 {
2495 client.OnTeleportLocationRequest += RequestTeleportLocation;
2496 client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
2440 client.OnTeleportHomeRequest += TeleportClientHome; 2497 client.OnTeleportHomeRequest += TeleportClientHome;
2441 client.OnSetStartLocationRequest += SetHomeRezPoint; 2498 }
2442 client.OnUndo += m_sceneGraph.HandleUndo; 2499
2443 client.OnObjectGroupRequest += m_sceneGraph.HandleObjectGroupUpdate; 2500 public virtual void SubscribeToClientScriptEvents(IClientAPI client)
2444 client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel; 2501 {
2445 client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime;
2446 client.OnObjectSaleInfo += ObjectSaleInfo;
2447 client.OnScriptReset += ProcessScriptReset; 2502 client.OnScriptReset += ProcessScriptReset;
2448 client.OnGetScriptRunning += GetScriptRunning; 2503 client.OnGetScriptRunning += GetScriptRunning;
2449 client.OnSetScriptRunning += SetScriptRunning; 2504 client.OnSetScriptRunning += SetScriptRunning;
2505 }
2506
2507 public virtual void SubscribeToClientParcelEvents(IClientAPI client)
2508 {
2509 client.OnObjectGroupRequest += m_sceneGraph.HandleObjectGroupUpdate;
2510 client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel;
2511 client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime;
2512 client.OnParcelBuy += ProcessParcelBuy;
2513 }
2514
2515 public virtual void SubscribeToClientGridEvents(IClientAPI client)
2516 {
2517 client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest;
2518 client.OnMoneyTransferRequest += ProcessMoneyTransferRequest;
2519 client.OnAvatarPickerRequest += ProcessAvatarPickerRequest;
2520 client.OnSetStartLocationRequest += SetHomeRezPoint;
2450 client.OnRegionHandleRequest += RegionHandleRequest; 2521 client.OnRegionHandleRequest += RegionHandleRequest;
2451 client.OnUnackedTerrain += TerrainUnAcked; 2522 }
2452 client.OnObjectOwner += ObjectOwner;
2453 2523
2524 public virtual void SubscribeToClientGodEvents(IClientAPI client)
2525 {
2454 IGodsModule godsModule = RequestModuleInterface<IGodsModule>(); 2526 IGodsModule godsModule = RequestModuleInterface<IGodsModule>();
2455 client.OnGodKickUser += godsModule.KickUser; 2527 client.OnGodKickUser += godsModule.KickUser;
2456 client.OnRequestGodlikePowers += godsModule.RequestGodlikePowers; 2528 client.OnRequestGodlikePowers += godsModule.RequestGodlikePowers;
2529 }
2457 2530
2531 public virtual void SubscribeToClientNetworkEvents(IClientAPI client)
2532 {
2458 client.OnNetworkStatsUpdate += StatsReporter.AddPacketsStats; 2533 client.OnNetworkStatsUpdate += StatsReporter.AddPacketsStats;
2534 }
2535
2536 protected virtual void UnsubscribeToClientEvents(IClientAPI client)
2537 {
2538
2539 }
2540
2541 /// <summary>
2542 /// Register for events from the client
2543 /// </summary>
2544 /// <param name="client">The IClientAPI of the connected client</param>
2545 public virtual void UnSubscribeToClientEvents(IClientAPI client)
2546 {
2547 UnSubscribeToClientTerrainEvents(client);
2548 UnSubscribeToClientPrimEvents(client);
2549 UnSubscribeToClientPrimRezEvents(client);
2550 UnSubscribeToClientInventoryEvents(client);
2551 UnSubscribeToClientAttachmentEvents(client);
2552 UnSubscribeToClientTeleportEvents(client);
2553 UnSubscribeToClientScriptEvents(client);
2554 UnSubscribeToClientParcelEvents(client);
2555 UnSubscribeToClientGridEvents(client);
2556 UnSubscribeToClientGodEvents(client);
2557
2558 UnSubscribeToClientNetworkEvents(client);
2559
2459 2560
2460 // EventManager.TriggerOnNewClient(client); 2561 // EventManager.TriggerOnNewClient(client);
2461 } 2562 }
2462 2563
2564 public virtual void UnSubscribeToClientTerrainEvents(IClientAPI client)
2565 {
2566 client.OnRegionHandShakeReply -= SendLayerData;
2567 client.OnUnackedTerrain -= TerrainUnAcked;
2568 }
2569
2570 public virtual void UnSubscribeToClientPrimEvents(IClientAPI client)
2571 {
2572 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimPosition;
2573 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition;
2574 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimRotation;
2575 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimRotation;
2576 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation;
2577 client.OnUpdatePrimSingleRotationPosition -= m_sceneGraph.UpdatePrimSingleRotationPosition;
2578 client.OnUpdatePrimScale -= m_sceneGraph.UpdatePrimScale;
2579 client.OnUpdatePrimGroupScale -= m_sceneGraph.UpdatePrimGroupScale;
2580 client.OnUpdateExtraParams -= m_sceneGraph.UpdateExtraParam;
2581 client.OnUpdatePrimShape -= m_sceneGraph.UpdatePrimShape;
2582 client.OnUpdatePrimTexture -= m_sceneGraph.UpdatePrimTexture;
2583 client.OnObjectRequest -= RequestPrim;
2584 client.OnObjectSelect -= SelectPrim;
2585 client.OnObjectDeselect -= DeselectPrim;
2586 client.OnGrabUpdate -= m_sceneGraph.MoveObject;
2587 client.OnSpinStart -= m_sceneGraph.SpinStart;
2588 client.OnSpinUpdate -= m_sceneGraph.SpinObject;
2589 client.OnDeRezObject -= DeRezObject;
2590 client.OnObjectName -= m_sceneGraph.PrimName;
2591 client.OnObjectClickAction -= m_sceneGraph.PrimClickAction;
2592 client.OnObjectMaterial -= m_sceneGraph.PrimMaterial;
2593 client.OnLinkObjects -= m_sceneGraph.LinkObjects;
2594 client.OnDelinkObjects -= m_sceneGraph.DelinkObjects;
2595 client.OnObjectDuplicate -= m_sceneGraph.DuplicateObject;
2596 client.OnObjectDuplicateOnRay -= doObjectDuplicateOnRay;
2597 client.OnUpdatePrimFlags -= m_sceneGraph.UpdatePrimFlags;
2598 client.OnRequestObjectPropertiesFamily -= m_sceneGraph.RequestObjectPropertiesFamily;
2599 client.OnObjectPermissions -= HandleObjectPermissionsUpdate;
2600 client.OnGrabObject -= ProcessObjectGrab;
2601 client.OnDeGrabObject -= ProcessObjectDeGrab;
2602 client.OnUndo -= m_sceneGraph.HandleUndo;
2603 client.OnObjectDescription -= m_sceneGraph.PrimDescription;
2604 client.OnObjectDrop -= m_sceneGraph.DropObject;
2605 client.OnObjectSaleInfo -= ObjectSaleInfo;
2606 client.OnObjectIncludeInSearch -= m_sceneGraph.MakeObjectSearchable;
2607 client.OnObjectOwner -= ObjectOwner;
2608 }
2609
2610 public virtual void UnSubscribeToClientPrimRezEvents(IClientAPI client)
2611 {
2612 client.OnAddPrim -= AddNewPrim;
2613 client.OnRezObject -= RezObject;
2614 }
2615
2616
2617 public virtual void UnSubscribeToClientInventoryEvents(IClientAPI client)
2618 {
2619 client.OnCreateNewInventoryItem -= CreateNewInventoryItem;
2620 client.OnCreateNewInventoryFolder -= HandleCreateInventoryFolder;
2621 client.OnUpdateInventoryFolder -= HandleUpdateInventoryFolder;
2622 client.OnMoveInventoryFolder -= HandleMoveInventoryFolder; // 2; //!!
2623 client.OnFetchInventoryDescendents -= HandleFetchInventoryDescendents;
2624 client.OnPurgeInventoryDescendents -= HandlePurgeInventoryDescendents; // 2; //!!
2625 client.OnFetchInventory -= HandleFetchInventory;
2626 client.OnUpdateInventoryItem -= UpdateInventoryItemAsset;
2627 client.OnCopyInventoryItem -= CopyInventoryItem;
2628 client.OnMoveInventoryItem -= MoveInventoryItem;
2629 client.OnRemoveInventoryItem -= RemoveInventoryItem;
2630 client.OnRemoveInventoryFolder -= RemoveInventoryFolder;
2631 client.OnRezScript -= RezScript;
2632 client.OnRequestTaskInventory -= RequestTaskInventory;
2633 client.OnRemoveTaskItem -= RemoveTaskInventory;
2634 client.OnUpdateTaskInventory -= UpdateTaskInventory;
2635 client.OnMoveTaskItem -= ClientMoveTaskInventoryItem;
2636 }
2637
2638 public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client)
2639 {
2640 client.OnRezSingleAttachmentFromInv -= RezSingleAttachment;
2641 client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments;
2642 client.OnDetachAttachmentIntoInv -= DetachSingleAttachmentToInv;
2643 client.OnObjectAttach -= m_sceneGraph.AttachObject;
2644 client.OnObjectDetach -= m_sceneGraph.DetachObject;
2645 }
2646
2647 public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client)
2648 {
2649 client.OnTeleportLocationRequest -= RequestTeleportLocation;
2650 client.OnTeleportLandmarkRequest -= RequestTeleportLandmark;
2651 client.OnTeleportHomeRequest -= TeleportClientHome;
2652 }
2653
2654 public virtual void UnSubscribeToClientScriptEvents(IClientAPI client)
2655 {
2656 client.OnScriptReset -= ProcessScriptReset;
2657 client.OnGetScriptRunning -= GetScriptRunning;
2658 client.OnSetScriptRunning -= SetScriptRunning;
2659 }
2660
2661 public virtual void UnSubscribeToClientParcelEvents(IClientAPI client)
2662 {
2663 client.OnObjectGroupRequest -= m_sceneGraph.HandleObjectGroupUpdate;
2664 client.OnParcelReturnObjectsRequest -= LandChannel.ReturnObjectsInParcel;
2665 client.OnParcelSetOtherCleanTime -= LandChannel.SetParcelOtherCleanTime;
2666 client.OnParcelBuy -= ProcessParcelBuy;
2667 }
2668
2669 public virtual void UnSubscribeToClientGridEvents(IClientAPI client)
2670 {
2671 client.OnNameFromUUIDRequest -= CommsManager.HandleUUIDNameRequest;
2672 client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest;
2673 client.OnAvatarPickerRequest -= ProcessAvatarPickerRequest;
2674 client.OnSetStartLocationRequest -= SetHomeRezPoint;
2675 client.OnRegionHandleRequest -= RegionHandleRequest;
2676 }
2677
2678 public virtual void UnSubscribeToClientGodEvents(IClientAPI client)
2679 {
2680 IGodsModule godsModule = RequestModuleInterface<IGodsModule>();
2681 client.OnGodKickUser -= godsModule.KickUser;
2682 client.OnRequestGodlikePowers -= godsModule.RequestGodlikePowers;
2683 }
2684
2685 public virtual void UnSubscribeToClientNetworkEvents(IClientAPI client)
2686 {
2687 client.OnNetworkStatsUpdate -= StatsReporter.AddPacketsStats;
2688 }
2689
2690
2691
2692
2463 /// <summary> 2693 /// <summary>
2464 /// Teleport an avatar to their home region 2694 /// Teleport an avatar to their home region
2465 /// </summary> 2695 /// </summary>
@@ -2617,6 +2847,7 @@ namespace OpenSim.Region.Framework.Scenes
2617 /// <returns></returns> 2847 /// <returns></returns>
2618 protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client) 2848 protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client)
2619 { 2849 {
2850 CheckHeartbeat();
2620 AvatarAppearance appearance = null; 2851 AvatarAppearance appearance = null;
2621 GetAvatarAppearance(client, out appearance); 2852 GetAvatarAppearance(client, out appearance);
2622 2853
@@ -2659,6 +2890,7 @@ namespace OpenSim.Region.Framework.Scenes
2659 /// <param name="agentID"></param> 2890 /// <param name="agentID"></param>
2660 public override void RemoveClient(UUID agentID) 2891 public override void RemoveClient(UUID agentID)
2661 { 2892 {
2893 CheckHeartbeat();
2662 bool childagentYN = false; 2894 bool childagentYN = false;
2663 ScenePresence avatar = GetScenePresence(agentID); 2895 ScenePresence avatar = GetScenePresence(agentID);
2664 if (avatar != null) 2896 if (avatar != null)
@@ -2926,11 +3158,17 @@ namespace OpenSim.Region.Framework.Scenes
2926 3158
2927 if (!agent.child) 3159 if (!agent.child)
2928 { 3160 {
2929 if (agent.startpos.X > (int)Constants.RegionSize - 1) 3161 if (TestBorderCross(agent.startpos,Cardinals.E))
2930 agent.startpos.X = (int)Constants.RegionSize - 1; 3162 {
3163 Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E);
3164 agent.startpos.X = crossedBorder.BorderLine.Z - 1;
3165 }
2931 3166
2932 if (agent.startpos.Y > (int)Constants.RegionSize - 1) 3167 if (TestBorderCross(agent.startpos, Cardinals.N))
2933 agent.startpos.Y = (int)Constants.RegionSize - 1; 3168 {
3169 Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.N);
3170 agent.startpos.Y = crossedBorder.BorderLine.Z - 1;
3171 }
2934 3172
2935 // Honor parcel landing type and position. 3173 // Honor parcel landing type and position.
2936 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); 3174 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
@@ -4160,6 +4398,8 @@ namespace OpenSim.Region.Framework.Scenes
4160 else 4398 else
4161 return health; 4399 return health;
4162 4400
4401 CheckHeartbeat();
4402
4163 return health; 4403 return health;
4164 } 4404 }
4165 4405
@@ -4345,5 +4585,14 @@ namespace OpenSim.Region.Framework.Scenes
4345 4585
4346 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; 4586 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
4347 } 4587 }
4588
4589 private void CheckHeartbeat()
4590 {
4591 if (m_firstHeartbeat)
4592 return;
4593
4594 if (System.Environment.TickCount - m_lastUpdate > 2000)
4595 StartTimer();
4596 }
4348 } 4597 }
4349} 4598}
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index c6b3f30..0827672 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -367,6 +367,7 @@ namespace OpenSim.Region.Framework.Scenes
367 string reason = String.Empty; 367 string reason = String.Empty;
368 368
369 //bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, a); 369 //bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, a);
370
370 bool regionAccepted = m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, out reason); 371 bool regionAccepted = m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, out reason);
371 372
372 if (regionAccepted && newAgent) 373 if (regionAccepted && newAgent)
@@ -384,7 +385,7 @@ namespace OpenSim.Region.Framework.Scenes
384 385
385 eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); 386 eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID);
386 eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); 387 eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath);
387 m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}", 388 m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}",
388 capsPath, avatar.UUID, avatar.Scene.RegionInfo.RegionName); 389 capsPath, avatar.UUID, avatar.Scene.RegionInfo.RegionName);
389 } 390 }
390 else 391 else
@@ -394,7 +395,9 @@ namespace OpenSim.Region.Framework.Scenes
394 } 395 }
395 396
396 m_log.Info("[INTERGRID]: Completed inform client about neighbour " + endPoint.ToString()); 397 m_log.Info("[INTERGRID]: Completed inform client about neighbour " + endPoint.ToString());
398
397 } 399 }
400
398 } 401 }
399 402
400 public void RequestNeighbors(RegionInfo region) 403 public void RequestNeighbors(RegionInfo region)
@@ -407,6 +410,65 @@ namespace OpenSim.Region.Framework.Scenes
407 //blah.Port = region.RemotingPort; 410 //blah.Port = region.RemotingPort;
408 } 411 }
409 412
413 public List<SimpleRegionInfo> RequestNeighbors(Scene pScene, uint pRegionLocX, uint pRegionLocY)
414 {
415 Border[] northBorders = pScene.NorthBorders.ToArray();
416 Border[] southBorders = pScene.SouthBorders.ToArray();
417 Border[] eastBorders = pScene.EastBorders.ToArray();
418 Border[] westBorders = pScene.WestBorders.ToArray();
419
420 // Legacy one region. Provided for simplicity while testing the all inclusive method in the else statement.
421 if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1)
422 {
423 return m_commsProvider.GridService.RequestNeighbours(pRegionLocX, pRegionLocY);
424 }
425 else
426 {
427 Vector2 extent = Vector2.Zero;
428 for (int i=0;i<eastBorders.Length;i++)
429 {
430 extent.X = (eastBorders[i].BorderLine.Z > extent.X) ? eastBorders[i].BorderLine.Z : extent.X;
431 }
432 for (int i=0;i<northBorders.Length;i++)
433 {
434 extent.Y = (northBorders[i].BorderLine.Z > extent.Y) ? northBorders[i].BorderLine.Z : extent.Y;
435 }
436
437 List<SimpleRegionInfo> neighbourList = new List<SimpleRegionInfo>();
438
439 // Loss of fraction on purpose
440 extent.X = ((int)extent.X / (int)Constants.RegionSize) + 1;
441 extent.Y = ((int)extent.Y / (int)Constants.RegionSize) + 1;
442
443 int startX = (int) pRegionLocX - 1;
444 int startY = (int) pRegionLocY - 1;
445
446 int endX = (int) pRegionLocX + (int)extent.X + 1;
447 int endY = (int) pRegionLocY + (int)extent.Y + 1;
448
449 for (int i=startX;i<endX;i++)
450 {
451 for (int j=startY;j<endY;j++)
452 {
453 // Skip CurrentRegion
454 if (i == (int)pRegionLocX && j == (int)pRegionLocY)
455 continue;
456
457 ulong regionHandle = Util.UIntsToLong((uint)(i * Constants.RegionSize),
458 (uint)(j * Constants.RegionSize));
459 RegionInfo neighborreg = m_commsProvider.GridService.RequestNeighbourInfo(regionHandle);
460 if (neighborreg != null)
461 {
462 neighbourList.Add(neighborreg);
463 }
464 }
465 }
466 return neighbourList;
467 //SimpleRegionInfo regionData = m_commsProvider.GridService.RequestNeighbourInfo()
468 //return m_commsProvider.GridService.RequestNeighbours(pRegionLocX, pRegionLocY);
469 }
470 }
471
410 /// <summary> 472 /// <summary>
411 /// This informs all neighboring regions about agent "avatar". 473 /// This informs all neighboring regions about agent "avatar".
412 /// Calls an asynchronous method to do so.. so it doesn't lag the sim. 474 /// Calls an asynchronous method to do so.. so it doesn't lag the sim.
@@ -429,7 +491,7 @@ namespace OpenSim.Region.Framework.Scenes
429 if (m_regionInfo != null) 491 if (m_regionInfo != null)
430 { 492 {
431 neighbours = 493 neighbours =
432 m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY); 494 RequestNeighbors(avatar.Scene,m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
433 } 495 }
434 else 496 else
435 { 497 {
@@ -536,6 +598,16 @@ namespace OpenSim.Region.Framework.Scenes
536 InformClientOfNeighbourCompleted, 598 InformClientOfNeighbourCompleted,
537 d); 599 d);
538 } 600 }
601
602 catch (ArgumentOutOfRangeException)
603 {
604 m_log.ErrorFormat(
605 "[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}).",
606 neighbour.ExternalHostName,
607 neighbour.RegionHandle,
608 neighbour.RegionLocX,
609 neighbour.RegionLocY);
610 }
539 catch (Exception e) 611 catch (Exception e)
540 { 612 {
541 m_log.ErrorFormat( 613 m_log.ErrorFormat(
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 857dc11..1024857 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -62,6 +62,8 @@ namespace OpenSim.Region.Framework.Scenes
62 public ScriptControlled eventControls; 62 public ScriptControlled eventControls;
63 } 63 }
64 64
65 public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence);
66
65 public class ScenePresence : EntityBase 67 public class ScenePresence : EntityBase
66 { 68 {
67// ~ScenePresence() 69// ~ScenePresence()
@@ -87,12 +89,15 @@ namespace OpenSim.Region.Framework.Scenes
87 public Vector3 lastKnownAllowedPosition; 89 public Vector3 lastKnownAllowedPosition;
88 public bool sentMessageAboutRestrictedParcelFlyingDown; 90 public bool sentMessageAboutRestrictedParcelFlyingDown;
89 91
92
93
90 private bool m_updateflag; 94 private bool m_updateflag;
91 private byte m_movementflag; 95 private byte m_movementflag;
92 private readonly List<NewForce> m_forcesList = new List<NewForce>(); 96 private readonly List<NewForce> m_forcesList = new List<NewForce>();
93 private short m_updateCount; 97 private short m_updateCount;
94 private uint m_requestedSitTargetID; 98 private uint m_requestedSitTargetID;
95 private UUID m_requestedSitTargetUUID = UUID.Zero; 99 private UUID m_requestedSitTargetUUID = UUID.Zero;
100 private SendCourseLocationsMethod m_sendCourseLocationsMethod;
96 101
97 private bool m_startAnimationSet; 102 private bool m_startAnimationSet;
98 103
@@ -616,6 +621,7 @@ namespace OpenSim.Region.Framework.Scenes
616 621
617 private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) 622 private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo)
618 { 623 {
624 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
619 CreateSceneViewer(); 625 CreateSceneViewer();
620 m_regionHandle = reginfo.RegionHandle; 626 m_regionHandle = reginfo.RegionHandle;
621 m_controllingClient = client; 627 m_controllingClient = client;
@@ -2458,6 +2464,21 @@ namespace OpenSim.Region.Framework.Scenes
2458 2464
2459 public void SendCoarseLocations() 2465 public void SendCoarseLocations()
2460 { 2466 {
2467 SendCourseLocationsMethod d = m_sendCourseLocationsMethod;
2468 if (d != null)
2469 {
2470 d.Invoke(m_scene.RegionInfo.originRegionID, this);
2471 }
2472 }
2473
2474 public void SetSendCourseLocationMethod(SendCourseLocationsMethod d)
2475 {
2476 if (d != null)
2477 m_sendCourseLocationsMethod = d;
2478 }
2479
2480 public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p)
2481 {
2461 m_perfMonMS = Environment.TickCount; 2482 m_perfMonMS = Environment.TickCount;
2462 2483
2463 List<Vector3> CoarseLocations = new List<Vector3>(); 2484 List<Vector3> CoarseLocations = new List<Vector3>();
@@ -3302,6 +3323,7 @@ namespace OpenSim.Region.Framework.Scenes
3302 { 3323 {
3303 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture(); 3324 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
3304 DefaultTexture = textu.GetBytes(); 3325 DefaultTexture = textu.GetBytes();
3326
3305 } 3327 }
3306 3328
3307 public class NewForce 3329 public class NewForce
@@ -3431,6 +3453,7 @@ namespace OpenSim.Region.Framework.Scenes
3431 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture(); 3453 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
3432 DefaultTexture = textu.GetBytes(); 3454 DefaultTexture = textu.GetBytes();
3433 } 3455 }
3456 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
3434 CreateSceneViewer(); 3457 CreateSceneViewer();
3435 } 3458 }
3436 3459