mirror of
https://github.com/opensim/opensim.git
synced 2026-08-10 19:36:07 +08:00
Merge branch 'master' of ssh://justincc@opensimulator.org/var/git/opensim
This commit is contained in:
@@ -59,7 +59,7 @@ namespace OpenSim.Region.Communications.Hypergrid
|
||||
HGUserServices userServices = new HGUserServices(this);
|
||||
// This plugin arrangement could eventually be configurable rather than hardcoded here.
|
||||
userServices.AddPlugin(new TemporaryUserProfilePlugin());
|
||||
userServices.AddPlugin(new OGS1UserDataPlugin(this));
|
||||
userServices.AddPlugin(new HGUserDataPlugin(this, userServices));
|
||||
|
||||
m_userService = userServices;
|
||||
m_messageService = userServices;
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace OpenSim.Region.Communications.Hypergrid
|
||||
HGUserServices hgUserService = new HGUserServices(this, localUserService);
|
||||
// This plugin arrangement could eventually be configurable rather than hardcoded here.
|
||||
hgUserService.AddPlugin(new TemporaryUserProfilePlugin());
|
||||
hgUserService.AddPlugin(new OGS1UserDataPlugin(this));
|
||||
hgUserService.AddPlugin(new HGUserDataPlugin(this, hgUserService));
|
||||
|
||||
m_userService = hgUserService;
|
||||
m_userAdminService = hgUserService;
|
||||
|
||||
72
OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs
Normal file
72
OpenSim/Region/Communications/Hypergrid/HGUserDataPlugin.cs
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Reflection;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml.Serialization;
|
||||
using log4net;
|
||||
using Nwc.XmlRpc;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Data;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications;
|
||||
using OpenSim.Framework.Communications.Clients;
|
||||
using OpenSim.Region.Communications.OGS1;
|
||||
|
||||
namespace OpenSim.Region.Communications.Hypergrid
|
||||
{
|
||||
public class HGUserDataPlugin : OGS1UserDataPlugin
|
||||
{
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
HGUserServices m_UserServices;
|
||||
|
||||
public HGUserDataPlugin()
|
||||
{
|
||||
}
|
||||
|
||||
public HGUserDataPlugin(CommunicationsManager commsManager, HGUserServices userServices)
|
||||
{
|
||||
m_log.DebugFormat("[HG USER SERVICES]: {0} initialized", Name);
|
||||
m_commsManager = commsManager;
|
||||
m_UserServices = userServices;
|
||||
}
|
||||
|
||||
protected override string GetUserServerURL(UUID userID)
|
||||
{
|
||||
string url = string.Empty;
|
||||
if (m_UserServices.IsForeignUser(userID, out url))
|
||||
return url;
|
||||
return m_commsManager.NetworkServersInfo.UserURL;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -311,9 +311,9 @@ namespace OpenSim.Region.Communications.Hypergrid
|
||||
return m_commsManager.NetworkServersInfo.UserURL;
|
||||
}
|
||||
|
||||
private bool IsForeignUser(UUID userID, out string userServerURL)
|
||||
public bool IsForeignUser(UUID userID, out string userServerURL)
|
||||
{
|
||||
userServerURL = string.Empty;
|
||||
userServerURL = m_commsManager.NetworkServersInfo.UserURL;
|
||||
CachedUserInfo uinfo = m_commsManager.UserProfileCacheService.GetUserDetails(userID);
|
||||
if (uinfo != null)
|
||||
{
|
||||
|
||||
@@ -48,6 +48,10 @@ namespace OpenSim.Region.Communications.OGS1
|
||||
|
||||
protected CommunicationsManager m_commsManager;
|
||||
|
||||
public OGS1UserDataPlugin()
|
||||
{
|
||||
}
|
||||
|
||||
public OGS1UserDataPlugin(CommunicationsManager commsManager)
|
||||
{
|
||||
m_log.DebugFormat("[OGS1 USER SERVICES]: {0} initialized", Name);
|
||||
@@ -108,7 +112,7 @@ namespace OpenSim.Region.Communications.OGS1
|
||||
parameters.Add(param);
|
||||
XmlRpcRequest req = new XmlRpcRequest("get_agent_by_uuid", parameters);
|
||||
|
||||
XmlRpcResponse resp = req.Send(GetUserServerURL(userId), 6000);
|
||||
XmlRpcResponse resp = req.Send(m_commsManager.NetworkServersInfo.UserURL, 6000);
|
||||
Hashtable respData = (Hashtable)resp.Value;
|
||||
if (respData.Contains("error_type"))
|
||||
{
|
||||
@@ -603,7 +607,7 @@ namespace OpenSim.Region.Communications.OGS1
|
||||
{
|
||||
if ((string)respData["returnString"] == "TRUE")
|
||||
{
|
||||
|
||||
m_log.DebugFormat("[OGS1 USER SERVICES]: Updated user appearance in {0}", GetUserServerURL(user));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -622,8 +626,8 @@ namespace OpenSim.Region.Communications.OGS1
|
||||
}
|
||||
catch (WebException e)
|
||||
{
|
||||
m_log.Warn("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance: " +
|
||||
e.Message);
|
||||
m_log.WarnFormat("[OGS1 USER SERVICES]: Error when trying to update Avatar's appearance in {0}: {1}",
|
||||
GetUserServerURL(user), e.Message);
|
||||
// Return Empty list (no friends)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ using System.Text.RegularExpressions;
|
||||
using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using Nwc.XmlRpc;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Communications;
|
||||
using OpenSim.Framework.Communications.Services;
|
||||
@@ -115,6 +116,8 @@ namespace OpenSim.Region.CoreModules.Hypergrid
|
||||
|
||||
httpServer.AddXmlRPCHandler("hg_login", m_loginService.XmlRpcLoginMethod);
|
||||
httpServer.AddXmlRPCHandler("check_auth_session", m_loginService.XmlRPCCheckAuthSession, false);
|
||||
httpServer.AddXmlRPCHandler("get_avatar_appearance", XmlRPCGetAvatarAppearance);
|
||||
httpServer.AddXmlRPCHandler("update_avatar_appearance", XmlRPCUpdateAvatarAppearance);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -256,5 +259,64 @@ namespace OpenSim.Region.CoreModules.Hypergrid
|
||||
scene = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
public XmlRpcResponse XmlRPCGetAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient)
|
||||
{
|
||||
XmlRpcResponse response = new XmlRpcResponse();
|
||||
Hashtable requestData = (Hashtable)request.Params[0];
|
||||
AvatarAppearance appearance;
|
||||
Hashtable responseData;
|
||||
if (requestData.Contains("owner"))
|
||||
{
|
||||
appearance = m_firstScene.CommsManager.AvatarService.GetUserAppearance(new UUID((string)requestData["owner"]));
|
||||
if (appearance == null)
|
||||
{
|
||||
responseData = new Hashtable();
|
||||
responseData["error_type"] = "no appearance";
|
||||
responseData["error_desc"] = "There was no appearance found for this avatar";
|
||||
}
|
||||
else
|
||||
{
|
||||
responseData = appearance.ToHashTable();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
responseData = new Hashtable();
|
||||
responseData["error_type"] = "unknown_avatar";
|
||||
responseData["error_desc"] = "The avatar appearance requested is not in the database";
|
||||
}
|
||||
|
||||
response.Value = responseData;
|
||||
return response;
|
||||
}
|
||||
|
||||
public XmlRpcResponse XmlRPCUpdateAvatarAppearance(XmlRpcRequest request, IPEndPoint remoteClient)
|
||||
{
|
||||
XmlRpcResponse response = new XmlRpcResponse();
|
||||
Hashtable requestData = (Hashtable)request.Params[0];
|
||||
Hashtable responseData;
|
||||
if (requestData.Contains("owner"))
|
||||
{
|
||||
AvatarAppearance appearance = new AvatarAppearance(requestData);
|
||||
|
||||
// TODO: Sometime in the future we may have a database layer that is capable of updating appearance when
|
||||
// the TextureEntry is null. When that happens, this check can be removed
|
||||
if (appearance.Texture != null)
|
||||
m_firstScene.CommsManager.AvatarService.UpdateUserAppearance(new UUID((string)requestData["owner"]), appearance);
|
||||
|
||||
responseData = new Hashtable();
|
||||
responseData["returnString"] = "TRUE";
|
||||
}
|
||||
else
|
||||
{
|
||||
responseData = new Hashtable();
|
||||
responseData["error_type"] = "unknown_avatar";
|
||||
responseData["error_desc"] = "The avatar appearance requested is not in the database";
|
||||
}
|
||||
response.Value = responseData;
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
|
||||
LogManager.GetLogger(
|
||||
MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
private IUserAccountDataService m_UserService;
|
||||
private IUserAccountService m_UserService;
|
||||
|
||||
private bool m_Enabled = false;
|
||||
|
||||
@@ -82,7 +82,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
|
||||
|
||||
Object[] args = new Object[] { source };
|
||||
m_UserService =
|
||||
ServerUtils.LoadPlugin<IUserAccountDataService>(serviceDll,
|
||||
ServerUtils.LoadPlugin<IUserAccountService>(serviceDll,
|
||||
args);
|
||||
|
||||
if (m_UserService == null)
|
||||
@@ -113,7 +113,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
scene.RegisterModuleInterface<IUserAccountDataService>(m_UserService);
|
||||
scene.RegisterModuleInterface<IUserAccountService>(m_UserService);
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
|
||||
@@ -37,7 +37,7 @@ using OpenSim.Services.Connectors;
|
||||
namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
|
||||
{
|
||||
public class RemoteUserServicesConnector : UserServicesConnector,
|
||||
ISharedRegionModule, IUserAccountDataService
|
||||
ISharedRegionModule, IUserAccountService
|
||||
{
|
||||
private static readonly ILog m_log =
|
||||
LogManager.GetLogger(
|
||||
@@ -96,7 +96,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.User
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
scene.RegisterModuleInterface<IUserAccountDataService>(this);
|
||||
scene.RegisterModuleInterface<IUserAccountService>(this);
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
|
||||
@@ -32,6 +32,7 @@ using log4net;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Client;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
@@ -71,6 +72,18 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
public void AddRegion(Scene scene)
|
||||
{
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene scene)
|
||||
{
|
||||
if (!enabledYN)
|
||||
return;
|
||||
|
||||
@@ -295,8 +308,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
m_log.DebugFormat("Scene: {0} to the west of Scene{1} Offset: {2}. Extents:{3}",
|
||||
conn.RegionScene.RegionInfo.RegionName,
|
||||
regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
|
||||
|
||||
|
||||
|
||||
|
||||
scene.BordersLocked = true;
|
||||
conn.RegionScene.BordersLocked = true;
|
||||
|
||||
@@ -325,9 +338,11 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
//
|
||||
scene.PhysicsScene.SetTerrain(scene.Heightmap.GetFloatsSerialised());
|
||||
//conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
|
||||
|
||||
|
||||
conn.RegionScene.BordersLocked = false;
|
||||
scene.BordersLocked = false;
|
||||
if (conn.ClientEventForwarder != null)
|
||||
conn.ClientEventForwarder.AddSceneToEventForwarding(scene);
|
||||
connectedYN = true;
|
||||
break;
|
||||
}
|
||||
@@ -367,7 +382,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
m_log.DebugFormat("Scene: {0} to the northeast of Scene{1} Offset: {2}. Extents:{3}",
|
||||
conn.RegionScene.RegionInfo.RegionName,
|
||||
regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
|
||||
conn.RegionScene.PhysicsScene.Combine(null,Vector3.Zero,extents);
|
||||
conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
|
||||
scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
|
||||
|
||||
lock (conn.RegionScene.NorthBorders)
|
||||
@@ -386,7 +401,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
|
||||
scene.BordersLocked = false;
|
||||
conn.RegionScene.BordersLocked = false;
|
||||
|
||||
if (conn.ClientEventForwarder != null)
|
||||
conn.ClientEventForwarder.AddSceneToEventForwarding(scene);
|
||||
connectedYN = true;
|
||||
break;
|
||||
}
|
||||
@@ -424,52 +440,52 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
m_log.DebugFormat("Scene: {0} to the NorthEast of Scene{1} Offset: {2}. Extents:{3}",
|
||||
conn.RegionScene.RegionInfo.RegionName,
|
||||
regionConnections.RegionScene.RegionInfo.RegionName, offset, extents);
|
||||
|
||||
|
||||
conn.RegionScene.PhysicsScene.Combine(null, Vector3.Zero, extents);
|
||||
scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset, Vector3.Zero);
|
||||
lock (conn.RegionScene.NorthBorders)
|
||||
if (conn.RegionScene.NorthBorders.Count == 1)// && 2)
|
||||
{
|
||||
//compound border
|
||||
// already locked above
|
||||
conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize;
|
||||
if (conn.RegionScene.NorthBorders.Count == 1)// && 2)
|
||||
{
|
||||
//compound border
|
||||
// already locked above
|
||||
conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize;
|
||||
|
||||
lock (conn.RegionScene.EastBorders)
|
||||
conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
lock (conn.RegionScene.WestBorders)
|
||||
conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
lock (conn.RegionScene.EastBorders)
|
||||
conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
lock (conn.RegionScene.WestBorders)
|
||||
conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
lock (scene.SouthBorders)
|
||||
scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south
|
||||
|
||||
|
||||
lock (conn.RegionScene.EastBorders)
|
||||
if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2)
|
||||
{
|
||||
if (conn.RegionScene.EastBorders.Count == 1)// && conn.RegionScene.EastBorders.Count == 2)
|
||||
{
|
||||
|
||||
conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize;
|
||||
lock (conn.RegionScene.NorthBorders)
|
||||
conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
lock (conn.RegionScene.SouthBorders)
|
||||
conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
conn.RegionScene.EastBorders[0].BorderLine.Z += (int)Constants.RegionSize;
|
||||
lock (conn.RegionScene.NorthBorders)
|
||||
conn.RegionScene.NorthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
lock (conn.RegionScene.SouthBorders)
|
||||
conn.RegionScene.SouthBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
lock (scene.WestBorders)
|
||||
scene.WestBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport West
|
||||
/*
|
||||
else
|
||||
{
|
||||
conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize;
|
||||
conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
else
|
||||
{
|
||||
conn.RegionScene.NorthBorders[0].BorderLine.Z += (int)Constants.RegionSize;
|
||||
conn.RegionScene.EastBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
conn.RegionScene.WestBorders[0].BorderLine.Y += (int)Constants.RegionSize;
|
||||
scene.SouthBorders[0].BorderLine.Z += (int)Constants.RegionSize; //auto teleport south
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// Reset Terrain.. since terrain normally loads first.
|
||||
//conn.RegionScene.PhysicsScene.SetTerrain(conn.RegionScene.Heightmap.GetFloatsSerialised());
|
||||
@@ -478,6 +494,9 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
scene.BordersLocked = false;
|
||||
conn.RegionScene.BordersLocked = false;
|
||||
|
||||
if (conn.ClientEventForwarder != null)
|
||||
conn.ClientEventForwarder.AddSceneToEventForwarding(scene);
|
||||
|
||||
connectedYN = true;
|
||||
|
||||
//scene.PhysicsScene.Combine(conn.RegionScene.PhysicsScene, offset,extents);
|
||||
@@ -495,7 +514,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
rdata.RegionScene = scene;
|
||||
regionConnections.RegionLandChannel = scene.LandChannel;
|
||||
|
||||
RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata,scene.LandChannel,regionConnections.ConnectedRegions);
|
||||
RegionCombinerLargeLandChannel lnd = new RegionCombinerLargeLandChannel(rdata, scene.LandChannel,
|
||||
regionConnections.ConnectedRegions);
|
||||
scene.LandChannel = lnd;
|
||||
lock (m_regions)
|
||||
{
|
||||
@@ -504,24 +524,157 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
ForwardPermissionRequests(regionConnections, r.RegionScene);
|
||||
}
|
||||
}
|
||||
|
||||
m_regions.Add(scene.RegionInfo.originRegionID,regionConnections);
|
||||
|
||||
regionConnections.ClientEventForwarder = new RegionCombinerClientEventForwarder(regionConnections);
|
||||
scene.EventManager.OnNewPresence += SetCourseLocationDelegate;
|
||||
m_regions.Add(scene.RegionInfo.originRegionID, regionConnections);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
AdjustLargeRegionBounds();
|
||||
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
private void SetCourseLocationDelegate(ScenePresence presence)
|
||||
{
|
||||
|
||||
presence.SetSendCourseLocationMethod(SendCourseLocationUpdates);
|
||||
}
|
||||
|
||||
private void SendCourseLocationUpdates(UUID sceneId, ScenePresence presence)
|
||||
{
|
||||
RegionConnections connectiondata = null;
|
||||
lock (m_regions)
|
||||
{
|
||||
if (m_regions.ContainsKey(sceneId))
|
||||
connectiondata = m_regions[sceneId];
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
List<ScenePresence> avatars = connectiondata.RegionScene.GetAvatars();
|
||||
List<Vector3> CoarseLocations = new List<Vector3>();
|
||||
List<UUID> AvatarUUIDs = new List<UUID>();
|
||||
for (int i = 0; i < avatars.Count; i++)
|
||||
{
|
||||
if (avatars[i].UUID != presence.UUID)
|
||||
{
|
||||
if (avatars[i].ParentID != 0)
|
||||
{
|
||||
// sitting avatar
|
||||
SceneObjectPart sop = connectiondata.RegionScene.GetSceneObjectPart(avatars[i].ParentID);
|
||||
if (sop != null)
|
||||
{
|
||||
CoarseLocations.Add(sop.AbsolutePosition + avatars[i].AbsolutePosition);
|
||||
AvatarUUIDs.Add(avatars[i].UUID);
|
||||
}
|
||||
else
|
||||
{
|
||||
// we can't find the parent.. ! arg!
|
||||
CoarseLocations.Add(avatars[i].AbsolutePosition);
|
||||
AvatarUUIDs.Add(avatars[i].UUID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CoarseLocations.Add(avatars[i].AbsolutePosition);
|
||||
AvatarUUIDs.Add(avatars[i].UUID);
|
||||
}
|
||||
}
|
||||
}
|
||||
DistributeCourseLocationUpdates(CoarseLocations, AvatarUUIDs, connectiondata, presence);
|
||||
}
|
||||
|
||||
private void DistributeCourseLocationUpdates(List<Vector3> locations, List<UUID> uuids,
|
||||
RegionConnections connectiondata, ScenePresence rootPresence)
|
||||
{
|
||||
RegionData[] rdata = connectiondata.ConnectedRegions.ToArray();
|
||||
List<IClientAPI> clients = new List<IClientAPI>();
|
||||
Dictionary<Vector2, RegionCourseLocationStruct> updates = new Dictionary<Vector2, RegionCourseLocationStruct>();
|
||||
|
||||
|
||||
// Root Region entry
|
||||
RegionCourseLocationStruct rootupdatedata = new RegionCourseLocationStruct();
|
||||
rootupdatedata.Locations = new List<Vector3>();
|
||||
rootupdatedata.Uuids = new List<UUID>();
|
||||
rootupdatedata.Offset = Vector2.Zero;
|
||||
|
||||
rootupdatedata.UserAPI = rootPresence.ControllingClient;
|
||||
|
||||
if (rootupdatedata.UserAPI != null)
|
||||
updates.Add(Vector2.Zero, rootupdatedata);
|
||||
|
||||
//Each Region needs an entry or we will end up with dead minimap dots
|
||||
foreach (RegionData regiondata in rdata)
|
||||
{
|
||||
Vector2 offset = new Vector2(regiondata.Offset.X, regiondata.Offset.Y);
|
||||
RegionCourseLocationStruct updatedata = new RegionCourseLocationStruct();
|
||||
updatedata.Locations = new List<Vector3>();
|
||||
updatedata.Uuids = new List<UUID>();
|
||||
updatedata.Offset = offset;
|
||||
|
||||
if (offset == Vector2.Zero)
|
||||
updatedata.UserAPI = rootPresence.ControllingClient;
|
||||
else
|
||||
updatedata.UserAPI = LocateUsersChildAgentIClientAPI(offset, rootPresence.UUID, rdata);
|
||||
|
||||
if (updatedata.UserAPI != null)
|
||||
updates.Add(offset, updatedata);
|
||||
}
|
||||
|
||||
// go over the locations and assign them to an IClientAPI
|
||||
for (int i = 0; i < locations.Count;i++ )
|
||||
//{locations[i]/(int) Constants.RegionSize;
|
||||
{
|
||||
Vector3 pPosition = new Vector3((int)locations[i].X / (int)Constants.RegionSize,
|
||||
(int)locations[i].Y / (int)Constants.RegionSize, locations[i].Z);
|
||||
Vector2 offset = new Vector2(pPosition.X*(int) Constants.RegionSize,
|
||||
pPosition.Y*(int) Constants.RegionSize);
|
||||
|
||||
if (!updates.ContainsKey(offset))
|
||||
{
|
||||
// This shouldn't happen
|
||||
RegionCourseLocationStruct updatedata = new RegionCourseLocationStruct();
|
||||
updatedata.Locations = new List<Vector3>();
|
||||
updatedata.Uuids = new List<UUID>();
|
||||
updatedata.Offset = offset;
|
||||
|
||||
if (offset == Vector2.Zero)
|
||||
updatedata.UserAPI = rootPresence.ControllingClient;
|
||||
else
|
||||
updatedata.UserAPI = LocateUsersChildAgentIClientAPI(offset, rootPresence.UUID, rdata);
|
||||
|
||||
updates.Add(offset,updatedata);
|
||||
|
||||
}
|
||||
|
||||
updates[offset].Locations.Add(locations[i]);
|
||||
updates[offset].Uuids.Add(uuids[i]);
|
||||
|
||||
}
|
||||
|
||||
// Send out the CoarseLocationupdates from their respective client connection based on where the avatar is
|
||||
foreach (Vector2 offset in updates.Keys)
|
||||
{
|
||||
if (updates[offset].UserAPI != null)
|
||||
{
|
||||
updates[offset].UserAPI.SendCoarseLocationUpdate(updates[offset].Uuids,updates[offset].Locations);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene scene)
|
||||
private IClientAPI LocateUsersChildAgentIClientAPI(Vector2 offset, UUID uUID, RegionData[] rdata)
|
||||
{
|
||||
|
||||
IClientAPI returnclient = null;
|
||||
foreach (RegionData r in rdata)
|
||||
{
|
||||
if (r.Offset.X == offset.X && r.Offset.Y == offset.Y)
|
||||
{
|
||||
return r.RegionScene.SceneGraph.GetControllingClient(uUID);
|
||||
}
|
||||
}
|
||||
|
||||
return returnclient;
|
||||
}
|
||||
|
||||
public void PostInitialise()
|
||||
@@ -529,6 +682,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void UnCombineRegion(RegionData rdata)
|
||||
{
|
||||
lock (m_regions)
|
||||
@@ -733,6 +888,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
public int YEnd;
|
||||
public List<RegionData> ConnectedRegions;
|
||||
public RegionCombinerPermissionModule PermissionModule;
|
||||
public RegionCombinerClientEventForwarder ClientEventForwarder;
|
||||
public void UpdateExtents(Vector3 extents)
|
||||
{
|
||||
XEnd = (int)extents.X;
|
||||
@@ -748,6 +904,13 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
public Vector3 Offset;
|
||||
|
||||
}
|
||||
struct RegionCourseLocationStruct
|
||||
{
|
||||
public List<Vector3> Locations;
|
||||
public List<UUID> Uuids;
|
||||
public IClientAPI UserAPI;
|
||||
public Vector2 Offset;
|
||||
}
|
||||
|
||||
public class RegionCombinerLargeLandChannel : ILandChannel
|
||||
{
|
||||
@@ -759,7 +922,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
|
||||
#region ILandChannel Members
|
||||
|
||||
public RegionCombinerLargeLandChannel(RegionData regData, ILandChannel rootRegionLandChannel,List<RegionData> regionConnections)
|
||||
public RegionCombinerLargeLandChannel(RegionData regData, ILandChannel rootRegionLandChannel,
|
||||
List<RegionData> regionConnections)
|
||||
{
|
||||
RegData = regData;
|
||||
RootRegionLandChannel = rootRegionLandChannel;
|
||||
@@ -790,7 +954,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
else
|
||||
{
|
||||
int offsetX = (x / (int)Constants.RegionSize);
|
||||
int offsetY = (x / (int)Constants.RegionSize);
|
||||
int offsetY = (y / (int)Constants.RegionSize);
|
||||
offsetX *= (int)Constants.RegionSize;
|
||||
offsetY *= (int)Constants.RegionSize;
|
||||
|
||||
@@ -823,7 +987,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
else
|
||||
{
|
||||
int offsetX = (int)(x/(int) Constants.RegionSize);
|
||||
int offsetY = (int)(x/(int) Constants.RegionSize);
|
||||
int offsetY = (int)(y/(int) Constants.RegionSize);
|
||||
offsetX *= (int) Constants.RegionSize;
|
||||
offsetY *= (int) Constants.RegionSize;
|
||||
|
||||
@@ -886,6 +1050,7 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
m_rootScene = RootScene;
|
||||
}
|
||||
|
||||
#region Permission Override
|
||||
public bool BypassPermissions()
|
||||
{
|
||||
return m_rootScene.Permissions.BypassPermissions();
|
||||
@@ -1110,5 +1275,137 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||
{
|
||||
return m_rootScene.Permissions.CanUseObjectReturn(landdata, type, client, retlist);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
public class RegionCombinerClientEventForwarder
|
||||
{
|
||||
private Scene m_rootScene;
|
||||
private Dictionary<UUID, Scene> m_virtScene = new Dictionary<UUID, Scene>();
|
||||
private Dictionary<UUID,RegionCombinerModuleIndividualForwarder> m_forwarders = new Dictionary<UUID,
|
||||
RegionCombinerModuleIndividualForwarder>();
|
||||
public RegionCombinerClientEventForwarder(RegionConnections rootScene)
|
||||
{
|
||||
m_rootScene = rootScene.RegionScene;
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void AddSceneToEventForwarding( Scene virtualScene )
|
||||
{
|
||||
lock (m_virtScene)
|
||||
{
|
||||
if (m_virtScene.ContainsKey(virtualScene.RegionInfo.originRegionID))
|
||||
{
|
||||
m_virtScene[virtualScene.RegionInfo.originRegionID] = virtualScene;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_virtScene.Add(virtualScene.RegionInfo.originRegionID, virtualScene);
|
||||
}
|
||||
}
|
||||
|
||||
lock (m_forwarders)
|
||||
{
|
||||
// TODO: Fix this to unregister if this happens
|
||||
if (m_forwarders.ContainsKey(virtualScene.RegionInfo.originRegionID))
|
||||
m_forwarders.Remove(virtualScene.RegionInfo.originRegionID);
|
||||
|
||||
RegionCombinerModuleIndividualForwarder forwarder =
|
||||
new RegionCombinerModuleIndividualForwarder(m_rootScene, virtualScene);
|
||||
m_forwarders.Add(virtualScene.RegionInfo.originRegionID, forwarder);
|
||||
|
||||
virtualScene.EventManager.OnNewClient += forwarder.ClientConnect;
|
||||
virtualScene.EventManager.OnClientClosed += forwarder.ClientClosed;
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveSceneFromEventForwarding (Scene virtualScene)
|
||||
{
|
||||
lock (m_forwarders)
|
||||
{
|
||||
RegionCombinerModuleIndividualForwarder forwarder = m_forwarders[virtualScene.RegionInfo.originRegionID];
|
||||
virtualScene.EventManager.OnNewClient -= forwarder.ClientConnect;
|
||||
virtualScene.EventManager.OnClientClosed -= forwarder.ClientClosed;
|
||||
m_forwarders.Remove(virtualScene.RegionInfo.originRegionID);
|
||||
}
|
||||
lock (m_virtScene)
|
||||
{
|
||||
if (m_virtScene.ContainsKey(virtualScene.RegionInfo.originRegionID))
|
||||
{
|
||||
m_virtScene.Remove(virtualScene.RegionInfo.originRegionID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class RegionCombinerModuleIndividualForwarder
|
||||
{
|
||||
private Scene m_rootScene;
|
||||
private Scene m_virtScene;
|
||||
public RegionCombinerModuleIndividualForwarder(Scene rootScene, Scene virtScene)
|
||||
{
|
||||
m_rootScene = rootScene;
|
||||
m_virtScene = virtScene;
|
||||
}
|
||||
|
||||
public void ClientConnect(IClientAPI client)
|
||||
{
|
||||
|
||||
m_virtScene.UnSubscribeToClientPrimEvents(client);
|
||||
m_virtScene.UnSubscribeToClientPrimRezEvents(client);
|
||||
m_virtScene.UnSubscribeToClientInventoryEvents(client);
|
||||
m_virtScene.UnSubscribeToClientAttachmentEvents(client);
|
||||
m_virtScene.UnSubscribeToClientTeleportEvents(client);
|
||||
m_virtScene.UnSubscribeToClientScriptEvents(client);
|
||||
m_virtScene.UnSubscribeToClientGodEvents(client);
|
||||
m_virtScene.UnSubscribeToClientNetworkEvents(client);
|
||||
|
||||
m_rootScene.SubscribeToClientPrimEvents(client);
|
||||
client.OnAddPrim += LocalAddNewPrim;
|
||||
client.OnRezObject += LocalRezObject;
|
||||
m_rootScene.SubscribeToClientInventoryEvents(client);
|
||||
m_rootScene.SubscribeToClientAttachmentEvents(client);
|
||||
m_rootScene.SubscribeToClientTeleportEvents(client);
|
||||
m_rootScene.SubscribeToClientScriptEvents(client);
|
||||
m_rootScene.SubscribeToClientGodEvents(client);
|
||||
m_rootScene.SubscribeToClientNetworkEvents(client);
|
||||
}
|
||||
public void ClientClosed(UUID clientid, Scene scene)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void LocalRezObject(IClientAPI remoteclient, UUID itemid, Vector3 rayend, Vector3 raystart,
|
||||
UUID raytargetid, byte bypassraycast, bool rayendisintersection, bool rezselected, bool removeitem,
|
||||
UUID fromtaskid)
|
||||
{
|
||||
int differenceX = (int)m_virtScene.RegionInfo.RegionLocX - (int)m_rootScene.RegionInfo.RegionLocX;
|
||||
int differenceY = (int)m_virtScene.RegionInfo.RegionLocY - (int)m_rootScene.RegionInfo.RegionLocY;
|
||||
rayend.X += differenceX * (int)Constants.RegionSize;
|
||||
rayend.Y += differenceY * (int)Constants.RegionSize;
|
||||
raystart.X += differenceX * (int)Constants.RegionSize;
|
||||
raystart.Y += differenceY * (int)Constants.RegionSize;
|
||||
|
||||
m_rootScene.RezObject(remoteclient, itemid, rayend, raystart, raytargetid, bypassraycast,
|
||||
rayendisintersection, rezselected, removeitem, fromtaskid);
|
||||
|
||||
}
|
||||
|
||||
private void LocalAddNewPrim(UUID ownerid, UUID groupid, Vector3 rayend, Quaternion rot,
|
||||
PrimitiveBaseShape shape, byte bypassraycast, Vector3 raystart, UUID raytargetid,
|
||||
byte rayendisintersection)
|
||||
{
|
||||
int differenceX = (int)m_virtScene.RegionInfo.RegionLocX - (int)m_rootScene.RegionInfo.RegionLocX;
|
||||
int differenceY = (int)m_virtScene.RegionInfo.RegionLocY - (int)m_rootScene.RegionInfo.RegionLocY;
|
||||
rayend.X += differenceX * (int)Constants.RegionSize;
|
||||
rayend.Y += differenceY * (int)Constants.RegionSize;
|
||||
raystart.X += differenceX * (int)Constants.RegionSize;
|
||||
raystart.Y += differenceY * (int)Constants.RegionSize;
|
||||
m_rootScene.AddNewPrim(ownerid, groupid, rayend, rot, shape, bypassraycast, raystart, raytargetid,
|
||||
rayendisintersection);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -113,26 +113,26 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
|
||||
UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
|
||||
bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
|
||||
{
|
||||
//m_log.DebugFormat("[HGScene] RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID);
|
||||
m_log.DebugFormat("[HGScene] RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID);
|
||||
|
||||
if (fromTaskID.Equals(UUID.Zero))
|
||||
//if (fromTaskID.Equals(UUID.Zero))
|
||||
//{
|
||||
InventoryItemBase item = new InventoryItemBase(itemID);
|
||||
item.Owner = remoteClient.AgentId;
|
||||
item = InventoryService.GetItem(item);
|
||||
//if (item == null)
|
||||
//{ // Fetch the item
|
||||
// item = new InventoryItemBase();
|
||||
// item.Owner = remoteClient.AgentId;
|
||||
// item.ID = itemID;
|
||||
// item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo);
|
||||
//}
|
||||
if (item != null)
|
||||
{
|
||||
InventoryItemBase item = new InventoryItemBase(itemID);
|
||||
item.Owner = remoteClient.AgentId;
|
||||
item = InventoryService.GetItem(item);
|
||||
//if (item == null)
|
||||
//{ // Fetch the item
|
||||
// item = new InventoryItemBase();
|
||||
// item.Owner = remoteClient.AgentId;
|
||||
// item.ID = itemID;
|
||||
// item = m_assMapper.Get(item, userInfo.RootFolder.ID, userInfo);
|
||||
//}
|
||||
if (item != null)
|
||||
{
|
||||
m_assMapper.Get(item.AssetID, remoteClient.AgentId);
|
||||
m_assMapper.Get(item.AssetID, remoteClient.AgentId);
|
||||
|
||||
}
|
||||
}
|
||||
//}
|
||||
|
||||
// OK, we're done fetching. Pass it up to the default RezObject
|
||||
return base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection,
|
||||
|
||||
@@ -220,11 +220,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
private bool m_scripts_enabled = true;
|
||||
private string m_defaultScriptEngine;
|
||||
private int m_LastLogin = 0;
|
||||
private Thread HeartbeatThread;
|
||||
private Thread HeartbeatThread = null;
|
||||
private volatile bool shuttingdown = false;
|
||||
|
||||
private int m_lastUpdate = Environment.TickCount;
|
||||
private int m_maxPrimsPerFrame = 200;
|
||||
private bool m_firstHeartbeat = true;
|
||||
|
||||
private object m_deleting_scene_object = new object();
|
||||
|
||||
@@ -876,6 +877,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
//m_heartbeatTimer.Enabled = true;
|
||||
//m_heartbeatTimer.Interval = (int)(m_timespan * 1000);
|
||||
//m_heartbeatTimer.Elapsed += new ElapsedEventHandler(Heartbeat);
|
||||
if (HeartbeatThread != null)
|
||||
{
|
||||
ThreadTracker.Remove(HeartbeatThread);
|
||||
HeartbeatThread.Abort();
|
||||
HeartbeatThread = null;
|
||||
}
|
||||
m_lastUpdate = Environment.TickCount;
|
||||
HeartbeatThread = new Thread(new ParameterizedThreadStart(Heartbeat));
|
||||
HeartbeatThread.SetApartmentState(ApartmentState.MTA);
|
||||
HeartbeatThread.Name = string.Format("Heartbeat for region {0}", RegionInfo.RegionName);
|
||||
@@ -912,9 +920,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <param name="e"></param>
|
||||
private void Heartbeat(object sender)
|
||||
{
|
||||
Update();
|
||||
try
|
||||
{
|
||||
Update();
|
||||
|
||||
m_lastUpdate = Environment.TickCount;
|
||||
m_lastUpdate = Environment.TickCount;
|
||||
m_firstHeartbeat = false;
|
||||
}
|
||||
catch (ThreadAbortException)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -2307,6 +2322,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <param name="client"></param>
|
||||
public override void AddNewClient(IClientAPI client)
|
||||
{
|
||||
CheckHeartbeat();
|
||||
SubscribeToClientEvents(client);
|
||||
ScenePresence presence;
|
||||
|
||||
@@ -2365,14 +2381,40 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
EventManager.TriggerOnNewClient(client);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Register for events from the client
|
||||
/// </summary>
|
||||
/// <param name="client">The IClientAPI of the connected client</param>
|
||||
protected virtual void SubscribeToClientEvents(IClientAPI client)
|
||||
public virtual void SubscribeToClientEvents(IClientAPI client)
|
||||
{
|
||||
SubscribeToClientTerrainEvents(client);
|
||||
SubscribeToClientPrimEvents(client);
|
||||
SubscribeToClientPrimRezEvents(client);
|
||||
SubscribeToClientInventoryEvents(client);
|
||||
SubscribeToClientAttachmentEvents(client);
|
||||
SubscribeToClientTeleportEvents(client);
|
||||
SubscribeToClientScriptEvents(client);
|
||||
SubscribeToClientParcelEvents(client);
|
||||
SubscribeToClientGridEvents(client);
|
||||
SubscribeToClientGodEvents(client);
|
||||
|
||||
SubscribeToClientNetworkEvents(client);
|
||||
|
||||
|
||||
// EventManager.TriggerOnNewClient(client);
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientTerrainEvents(IClientAPI client)
|
||||
{
|
||||
client.OnRegionHandShakeReply += SendLayerData;
|
||||
client.OnAddPrim += AddNewPrim;
|
||||
client.OnUnackedTerrain += TerrainUnAcked;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientPrimEvents(IClientAPI client)
|
||||
{
|
||||
|
||||
client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimPosition;
|
||||
client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition;
|
||||
client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimRotation;
|
||||
@@ -2384,8 +2426,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
client.OnUpdateExtraParams += m_sceneGraph.UpdateExtraParam;
|
||||
client.OnUpdatePrimShape += m_sceneGraph.UpdatePrimShape;
|
||||
client.OnUpdatePrimTexture += m_sceneGraph.UpdatePrimTexture;
|
||||
client.OnTeleportLocationRequest += RequestTeleportLocation;
|
||||
client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
|
||||
client.OnObjectRequest += RequestPrim;
|
||||
client.OnObjectSelect += SelectPrim;
|
||||
client.OnObjectDeselect += DeselectPrim;
|
||||
@@ -2393,15 +2433,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
client.OnSpinStart += m_sceneGraph.SpinStart;
|
||||
client.OnSpinUpdate += m_sceneGraph.SpinObject;
|
||||
client.OnDeRezObject += DeRezObject;
|
||||
client.OnRezObject += RezObject;
|
||||
client.OnRezSingleAttachmentFromInv += RezSingleAttachment;
|
||||
client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments;
|
||||
client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv;
|
||||
client.OnObjectAttach += m_sceneGraph.AttachObject;
|
||||
client.OnObjectDetach += m_sceneGraph.DetachObject;
|
||||
client.OnObjectDrop += m_sceneGraph.DropObject;
|
||||
client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest;
|
||||
client.OnObjectDescription += m_sceneGraph.PrimDescription;
|
||||
|
||||
client.OnObjectName += m_sceneGraph.PrimName;
|
||||
client.OnObjectClickAction += m_sceneGraph.PrimClickAction;
|
||||
client.OnObjectMaterial += m_sceneGraph.PrimMaterial;
|
||||
@@ -2412,7 +2444,24 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags;
|
||||
client.OnRequestObjectPropertiesFamily += m_sceneGraph.RequestObjectPropertiesFamily;
|
||||
client.OnObjectPermissions += HandleObjectPermissionsUpdate;
|
||||
client.OnGrabObject += ProcessObjectGrab;
|
||||
client.OnDeGrabObject += ProcessObjectDeGrab;
|
||||
client.OnUndo += m_sceneGraph.HandleUndo;
|
||||
client.OnObjectDescription += m_sceneGraph.PrimDescription;
|
||||
client.OnObjectDrop += m_sceneGraph.DropObject;
|
||||
client.OnObjectSaleInfo += ObjectSaleInfo;
|
||||
client.OnObjectIncludeInSearch += m_sceneGraph.MakeObjectSearchable;
|
||||
client.OnObjectOwner += ObjectOwner;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientPrimRezEvents(IClientAPI client)
|
||||
{
|
||||
client.OnAddPrim += AddNewPrim;
|
||||
client.OnRezObject += RezObject;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientInventoryEvents(IClientAPI client)
|
||||
{
|
||||
client.OnCreateNewInventoryItem += CreateNewInventoryItem;
|
||||
client.OnCreateNewInventoryFolder += HandleCreateInventoryFolder;
|
||||
client.OnUpdateInventoryFolder += HandleUpdateInventoryFolder;
|
||||
@@ -2430,36 +2479,217 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
client.OnRemoveTaskItem += RemoveTaskInventory;
|
||||
client.OnUpdateTaskInventory += UpdateTaskInventory;
|
||||
client.OnMoveTaskItem += ClientMoveTaskInventoryItem;
|
||||
}
|
||||
|
||||
client.OnGrabObject += ProcessObjectGrab;
|
||||
client.OnDeGrabObject += ProcessObjectDeGrab;
|
||||
client.OnMoneyTransferRequest += ProcessMoneyTransferRequest;
|
||||
client.OnParcelBuy += ProcessParcelBuy;
|
||||
client.OnAvatarPickerRequest += ProcessAvatarPickerRequest;
|
||||
client.OnObjectIncludeInSearch += m_sceneGraph.MakeObjectSearchable;
|
||||
public virtual void SubscribeToClientAttachmentEvents(IClientAPI client)
|
||||
{
|
||||
client.OnRezSingleAttachmentFromInv += RezSingleAttachment;
|
||||
client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments;
|
||||
client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv;
|
||||
client.OnObjectAttach += m_sceneGraph.AttachObject;
|
||||
client.OnObjectDetach += m_sceneGraph.DetachObject;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientTeleportEvents(IClientAPI client)
|
||||
{
|
||||
client.OnTeleportLocationRequest += RequestTeleportLocation;
|
||||
client.OnTeleportLandmarkRequest += RequestTeleportLandmark;
|
||||
client.OnTeleportHomeRequest += TeleportClientHome;
|
||||
client.OnSetStartLocationRequest += SetHomeRezPoint;
|
||||
client.OnUndo += m_sceneGraph.HandleUndo;
|
||||
client.OnObjectGroupRequest += m_sceneGraph.HandleObjectGroupUpdate;
|
||||
client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel;
|
||||
client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime;
|
||||
client.OnObjectSaleInfo += ObjectSaleInfo;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientScriptEvents(IClientAPI client)
|
||||
{
|
||||
client.OnScriptReset += ProcessScriptReset;
|
||||
client.OnGetScriptRunning += GetScriptRunning;
|
||||
client.OnSetScriptRunning += SetScriptRunning;
|
||||
client.OnRegionHandleRequest += RegionHandleRequest;
|
||||
client.OnUnackedTerrain += TerrainUnAcked;
|
||||
client.OnObjectOwner += ObjectOwner;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientParcelEvents(IClientAPI client)
|
||||
{
|
||||
client.OnObjectGroupRequest += m_sceneGraph.HandleObjectGroupUpdate;
|
||||
client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel;
|
||||
client.OnParcelSetOtherCleanTime += LandChannel.SetParcelOtherCleanTime;
|
||||
client.OnParcelBuy += ProcessParcelBuy;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientGridEvents(IClientAPI client)
|
||||
{
|
||||
client.OnNameFromUUIDRequest += CommsManager.HandleUUIDNameRequest;
|
||||
client.OnMoneyTransferRequest += ProcessMoneyTransferRequest;
|
||||
client.OnAvatarPickerRequest += ProcessAvatarPickerRequest;
|
||||
client.OnSetStartLocationRequest += SetHomeRezPoint;
|
||||
client.OnRegionHandleRequest += RegionHandleRequest;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientGodEvents(IClientAPI client)
|
||||
{
|
||||
IGodsModule godsModule = RequestModuleInterface<IGodsModule>();
|
||||
client.OnGodKickUser += godsModule.KickUser;
|
||||
client.OnRequestGodlikePowers += godsModule.RequestGodlikePowers;
|
||||
}
|
||||
|
||||
public virtual void SubscribeToClientNetworkEvents(IClientAPI client)
|
||||
{
|
||||
client.OnNetworkStatsUpdate += StatsReporter.AddPacketsStats;
|
||||
}
|
||||
|
||||
protected virtual void UnsubscribeToClientEvents(IClientAPI client)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Register for events from the client
|
||||
/// </summary>
|
||||
/// <param name="client">The IClientAPI of the connected client</param>
|
||||
public virtual void UnSubscribeToClientEvents(IClientAPI client)
|
||||
{
|
||||
UnSubscribeToClientTerrainEvents(client);
|
||||
UnSubscribeToClientPrimEvents(client);
|
||||
UnSubscribeToClientPrimRezEvents(client);
|
||||
UnSubscribeToClientInventoryEvents(client);
|
||||
UnSubscribeToClientAttachmentEvents(client);
|
||||
UnSubscribeToClientTeleportEvents(client);
|
||||
UnSubscribeToClientScriptEvents(client);
|
||||
UnSubscribeToClientParcelEvents(client);
|
||||
UnSubscribeToClientGridEvents(client);
|
||||
UnSubscribeToClientGodEvents(client);
|
||||
|
||||
UnSubscribeToClientNetworkEvents(client);
|
||||
|
||||
|
||||
// EventManager.TriggerOnNewClient(client);
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientTerrainEvents(IClientAPI client)
|
||||
{
|
||||
client.OnRegionHandShakeReply -= SendLayerData;
|
||||
client.OnUnackedTerrain -= TerrainUnAcked;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientPrimEvents(IClientAPI client)
|
||||
{
|
||||
client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimPosition;
|
||||
client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition;
|
||||
client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimRotation;
|
||||
client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimRotation;
|
||||
client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation;
|
||||
client.OnUpdatePrimSingleRotationPosition -= m_sceneGraph.UpdatePrimSingleRotationPosition;
|
||||
client.OnUpdatePrimScale -= m_sceneGraph.UpdatePrimScale;
|
||||
client.OnUpdatePrimGroupScale -= m_sceneGraph.UpdatePrimGroupScale;
|
||||
client.OnUpdateExtraParams -= m_sceneGraph.UpdateExtraParam;
|
||||
client.OnUpdatePrimShape -= m_sceneGraph.UpdatePrimShape;
|
||||
client.OnUpdatePrimTexture -= m_sceneGraph.UpdatePrimTexture;
|
||||
client.OnObjectRequest -= RequestPrim;
|
||||
client.OnObjectSelect -= SelectPrim;
|
||||
client.OnObjectDeselect -= DeselectPrim;
|
||||
client.OnGrabUpdate -= m_sceneGraph.MoveObject;
|
||||
client.OnSpinStart -= m_sceneGraph.SpinStart;
|
||||
client.OnSpinUpdate -= m_sceneGraph.SpinObject;
|
||||
client.OnDeRezObject -= DeRezObject;
|
||||
client.OnObjectName -= m_sceneGraph.PrimName;
|
||||
client.OnObjectClickAction -= m_sceneGraph.PrimClickAction;
|
||||
client.OnObjectMaterial -= m_sceneGraph.PrimMaterial;
|
||||
client.OnLinkObjects -= m_sceneGraph.LinkObjects;
|
||||
client.OnDelinkObjects -= m_sceneGraph.DelinkObjects;
|
||||
client.OnObjectDuplicate -= m_sceneGraph.DuplicateObject;
|
||||
client.OnObjectDuplicateOnRay -= doObjectDuplicateOnRay;
|
||||
client.OnUpdatePrimFlags -= m_sceneGraph.UpdatePrimFlags;
|
||||
client.OnRequestObjectPropertiesFamily -= m_sceneGraph.RequestObjectPropertiesFamily;
|
||||
client.OnObjectPermissions -= HandleObjectPermissionsUpdate;
|
||||
client.OnGrabObject -= ProcessObjectGrab;
|
||||
client.OnDeGrabObject -= ProcessObjectDeGrab;
|
||||
client.OnUndo -= m_sceneGraph.HandleUndo;
|
||||
client.OnObjectDescription -= m_sceneGraph.PrimDescription;
|
||||
client.OnObjectDrop -= m_sceneGraph.DropObject;
|
||||
client.OnObjectSaleInfo -= ObjectSaleInfo;
|
||||
client.OnObjectIncludeInSearch -= m_sceneGraph.MakeObjectSearchable;
|
||||
client.OnObjectOwner -= ObjectOwner;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientPrimRezEvents(IClientAPI client)
|
||||
{
|
||||
client.OnAddPrim -= AddNewPrim;
|
||||
client.OnRezObject -= RezObject;
|
||||
}
|
||||
|
||||
|
||||
public virtual void UnSubscribeToClientInventoryEvents(IClientAPI client)
|
||||
{
|
||||
client.OnCreateNewInventoryItem -= CreateNewInventoryItem;
|
||||
client.OnCreateNewInventoryFolder -= HandleCreateInventoryFolder;
|
||||
client.OnUpdateInventoryFolder -= HandleUpdateInventoryFolder;
|
||||
client.OnMoveInventoryFolder -= HandleMoveInventoryFolder; // 2; //!!
|
||||
client.OnFetchInventoryDescendents -= HandleFetchInventoryDescendents;
|
||||
client.OnPurgeInventoryDescendents -= HandlePurgeInventoryDescendents; // 2; //!!
|
||||
client.OnFetchInventory -= HandleFetchInventory;
|
||||
client.OnUpdateInventoryItem -= UpdateInventoryItemAsset;
|
||||
client.OnCopyInventoryItem -= CopyInventoryItem;
|
||||
client.OnMoveInventoryItem -= MoveInventoryItem;
|
||||
client.OnRemoveInventoryItem -= RemoveInventoryItem;
|
||||
client.OnRemoveInventoryFolder -= RemoveInventoryFolder;
|
||||
client.OnRezScript -= RezScript;
|
||||
client.OnRequestTaskInventory -= RequestTaskInventory;
|
||||
client.OnRemoveTaskItem -= RemoveTaskInventory;
|
||||
client.OnUpdateTaskInventory -= UpdateTaskInventory;
|
||||
client.OnMoveTaskItem -= ClientMoveTaskInventoryItem;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client)
|
||||
{
|
||||
client.OnRezSingleAttachmentFromInv -= RezSingleAttachment;
|
||||
client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments;
|
||||
client.OnDetachAttachmentIntoInv -= DetachSingleAttachmentToInv;
|
||||
client.OnObjectAttach -= m_sceneGraph.AttachObject;
|
||||
client.OnObjectDetach -= m_sceneGraph.DetachObject;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client)
|
||||
{
|
||||
client.OnTeleportLocationRequest -= RequestTeleportLocation;
|
||||
client.OnTeleportLandmarkRequest -= RequestTeleportLandmark;
|
||||
client.OnTeleportHomeRequest -= TeleportClientHome;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientScriptEvents(IClientAPI client)
|
||||
{
|
||||
client.OnScriptReset -= ProcessScriptReset;
|
||||
client.OnGetScriptRunning -= GetScriptRunning;
|
||||
client.OnSetScriptRunning -= SetScriptRunning;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientParcelEvents(IClientAPI client)
|
||||
{
|
||||
client.OnObjectGroupRequest -= m_sceneGraph.HandleObjectGroupUpdate;
|
||||
client.OnParcelReturnObjectsRequest -= LandChannel.ReturnObjectsInParcel;
|
||||
client.OnParcelSetOtherCleanTime -= LandChannel.SetParcelOtherCleanTime;
|
||||
client.OnParcelBuy -= ProcessParcelBuy;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientGridEvents(IClientAPI client)
|
||||
{
|
||||
client.OnNameFromUUIDRequest -= CommsManager.HandleUUIDNameRequest;
|
||||
client.OnMoneyTransferRequest -= ProcessMoneyTransferRequest;
|
||||
client.OnAvatarPickerRequest -= ProcessAvatarPickerRequest;
|
||||
client.OnSetStartLocationRequest -= SetHomeRezPoint;
|
||||
client.OnRegionHandleRequest -= RegionHandleRequest;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientGodEvents(IClientAPI client)
|
||||
{
|
||||
IGodsModule godsModule = RequestModuleInterface<IGodsModule>();
|
||||
client.OnGodKickUser -= godsModule.KickUser;
|
||||
client.OnRequestGodlikePowers -= godsModule.RequestGodlikePowers;
|
||||
}
|
||||
|
||||
public virtual void UnSubscribeToClientNetworkEvents(IClientAPI client)
|
||||
{
|
||||
client.OnNetworkStatsUpdate -= StatsReporter.AddPacketsStats;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Teleport an avatar to their home region
|
||||
/// </summary>
|
||||
@@ -2617,6 +2847,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <returns></returns>
|
||||
protected virtual ScenePresence CreateAndAddScenePresence(IClientAPI client)
|
||||
{
|
||||
CheckHeartbeat();
|
||||
AvatarAppearance appearance = null;
|
||||
GetAvatarAppearance(client, out appearance);
|
||||
|
||||
@@ -2659,6 +2890,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <param name="agentID"></param>
|
||||
public override void RemoveClient(UUID agentID)
|
||||
{
|
||||
CheckHeartbeat();
|
||||
bool childagentYN = false;
|
||||
ScenePresence avatar = GetScenePresence(agentID);
|
||||
if (avatar != null)
|
||||
@@ -2926,11 +3158,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
if (!agent.child)
|
||||
{
|
||||
if (agent.startpos.X > (int)Constants.RegionSize - 1)
|
||||
agent.startpos.X = (int)Constants.RegionSize - 1;
|
||||
if (TestBorderCross(agent.startpos,Cardinals.E))
|
||||
{
|
||||
Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.E);
|
||||
agent.startpos.X = crossedBorder.BorderLine.Z - 1;
|
||||
}
|
||||
|
||||
if (agent.startpos.Y > (int)Constants.RegionSize - 1)
|
||||
agent.startpos.Y = (int)Constants.RegionSize - 1;
|
||||
if (TestBorderCross(agent.startpos, Cardinals.N))
|
||||
{
|
||||
Border crossedBorder = GetCrossedBorder(agent.startpos, Cardinals.N);
|
||||
agent.startpos.Y = crossedBorder.BorderLine.Z - 1;
|
||||
}
|
||||
|
||||
// Honor parcel landing type and position.
|
||||
ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
|
||||
@@ -4160,6 +4398,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
else
|
||||
return health;
|
||||
|
||||
CheckHeartbeat();
|
||||
|
||||
return health;
|
||||
}
|
||||
|
||||
@@ -4345,5 +4585,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
|
||||
}
|
||||
|
||||
private void CheckHeartbeat()
|
||||
{
|
||||
if (m_firstHeartbeat)
|
||||
return;
|
||||
|
||||
if (System.Environment.TickCount - m_lastUpdate > 2000)
|
||||
StartTimer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,6 +367,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
string reason = String.Empty;
|
||||
|
||||
//bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(reg.RegionHandle, a);
|
||||
|
||||
bool regionAccepted = m_interregionCommsOut.SendCreateChildAgent(reg.RegionHandle, a, out reason);
|
||||
|
||||
if (regionAccepted && newAgent)
|
||||
@@ -384,7 +385,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID);
|
||||
eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath);
|
||||
m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}",
|
||||
m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}",
|
||||
capsPath, avatar.UUID, avatar.Scene.RegionInfo.RegionName);
|
||||
}
|
||||
else
|
||||
@@ -394,7 +395,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
|
||||
m_log.Info("[INTERGRID]: Completed inform client about neighbour " + endPoint.ToString());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void RequestNeighbors(RegionInfo region)
|
||||
@@ -407,6 +410,65 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
//blah.Port = region.RemotingPort;
|
||||
}
|
||||
|
||||
public List<SimpleRegionInfo> RequestNeighbors(Scene pScene, uint pRegionLocX, uint pRegionLocY)
|
||||
{
|
||||
Border[] northBorders = pScene.NorthBorders.ToArray();
|
||||
Border[] southBorders = pScene.SouthBorders.ToArray();
|
||||
Border[] eastBorders = pScene.EastBorders.ToArray();
|
||||
Border[] westBorders = pScene.WestBorders.ToArray();
|
||||
|
||||
// Legacy one region. Provided for simplicity while testing the all inclusive method in the else statement.
|
||||
if (northBorders.Length <= 1 && southBorders.Length <= 1 && eastBorders.Length <= 1 && westBorders.Length <= 1)
|
||||
{
|
||||
return m_commsProvider.GridService.RequestNeighbours(pRegionLocX, pRegionLocY);
|
||||
}
|
||||
else
|
||||
{
|
||||
Vector2 extent = Vector2.Zero;
|
||||
for (int i=0;i<eastBorders.Length;i++)
|
||||
{
|
||||
extent.X = (eastBorders[i].BorderLine.Z > extent.X) ? eastBorders[i].BorderLine.Z : extent.X;
|
||||
}
|
||||
for (int i=0;i<northBorders.Length;i++)
|
||||
{
|
||||
extent.Y = (northBorders[i].BorderLine.Z > extent.Y) ? northBorders[i].BorderLine.Z : extent.Y;
|
||||
}
|
||||
|
||||
List<SimpleRegionInfo> neighbourList = new List<SimpleRegionInfo>();
|
||||
|
||||
// Loss of fraction on purpose
|
||||
extent.X = ((int)extent.X / (int)Constants.RegionSize) + 1;
|
||||
extent.Y = ((int)extent.Y / (int)Constants.RegionSize) + 1;
|
||||
|
||||
int startX = (int) pRegionLocX - 1;
|
||||
int startY = (int) pRegionLocY - 1;
|
||||
|
||||
int endX = (int) pRegionLocX + (int)extent.X + 1;
|
||||
int endY = (int) pRegionLocY + (int)extent.Y + 1;
|
||||
|
||||
for (int i=startX;i<endX;i++)
|
||||
{
|
||||
for (int j=startY;j<endY;j++)
|
||||
{
|
||||
// Skip CurrentRegion
|
||||
if (i == (int)pRegionLocX && j == (int)pRegionLocY)
|
||||
continue;
|
||||
|
||||
ulong regionHandle = Util.UIntsToLong((uint)(i * Constants.RegionSize),
|
||||
(uint)(j * Constants.RegionSize));
|
||||
RegionInfo neighborreg = m_commsProvider.GridService.RequestNeighbourInfo(regionHandle);
|
||||
if (neighborreg != null)
|
||||
{
|
||||
neighbourList.Add(neighborreg);
|
||||
}
|
||||
}
|
||||
}
|
||||
return neighbourList;
|
||||
//SimpleRegionInfo regionData = m_commsProvider.GridService.RequestNeighbourInfo()
|
||||
//return m_commsProvider.GridService.RequestNeighbours(pRegionLocX, pRegionLocY);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This informs all neighboring regions about agent "avatar".
|
||||
/// Calls an asynchronous method to do so.. so it doesn't lag the sim.
|
||||
@@ -429,7 +491,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
if (m_regionInfo != null)
|
||||
{
|
||||
neighbours =
|
||||
m_commsProvider.GridService.RequestNeighbours(m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
|
||||
RequestNeighbors(avatar.Scene,m_regionInfo.RegionLocX, m_regionInfo.RegionLocY);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -536,6 +598,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
InformClientOfNeighbourCompleted,
|
||||
d);
|
||||
}
|
||||
|
||||
catch (ArgumentOutOfRangeException)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
"[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}).",
|
||||
neighbour.ExternalHostName,
|
||||
neighbour.RegionHandle,
|
||||
neighbour.RegionLocX,
|
||||
neighbour.RegionLocY);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat(
|
||||
|
||||
@@ -62,6 +62,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
public ScriptControlled eventControls;
|
||||
}
|
||||
|
||||
public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence);
|
||||
|
||||
public class ScenePresence : EntityBase
|
||||
{
|
||||
// ~ScenePresence()
|
||||
@@ -87,12 +89,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
public Vector3 lastKnownAllowedPosition;
|
||||
public bool sentMessageAboutRestrictedParcelFlyingDown;
|
||||
|
||||
|
||||
|
||||
private bool m_updateflag;
|
||||
private byte m_movementflag;
|
||||
private readonly List<NewForce> m_forcesList = new List<NewForce>();
|
||||
private short m_updateCount;
|
||||
private uint m_requestedSitTargetID;
|
||||
private UUID m_requestedSitTargetUUID = UUID.Zero;
|
||||
private SendCourseLocationsMethod m_sendCourseLocationsMethod;
|
||||
|
||||
private bool m_startAnimationSet;
|
||||
|
||||
@@ -616,6 +621,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
|
||||
private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo)
|
||||
{
|
||||
m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
|
||||
CreateSceneViewer();
|
||||
m_regionHandle = reginfo.RegionHandle;
|
||||
m_controllingClient = client;
|
||||
@@ -2457,6 +2463,21 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
|
||||
public void SendCoarseLocations()
|
||||
{
|
||||
SendCourseLocationsMethod d = m_sendCourseLocationsMethod;
|
||||
if (d != null)
|
||||
{
|
||||
d.Invoke(m_scene.RegionInfo.originRegionID, this);
|
||||
}
|
||||
}
|
||||
|
||||
public void SetSendCourseLocationMethod(SendCourseLocationsMethod d)
|
||||
{
|
||||
if (d != null)
|
||||
m_sendCourseLocationsMethod = d;
|
||||
}
|
||||
|
||||
public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p)
|
||||
{
|
||||
m_perfMonMS = Environment.TickCount;
|
||||
|
||||
@@ -3302,6 +3323,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
{
|
||||
Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
|
||||
DefaultTexture = textu.GetBytes();
|
||||
|
||||
}
|
||||
|
||||
public class NewForce
|
||||
@@ -3431,6 +3453,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
|
||||
DefaultTexture = textu.GetBytes();
|
||||
}
|
||||
m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
|
||||
CreateSceneViewer();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user