From f2b175ef08066649a13b6a42f0a59d9bee503638 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Sun, 9 Dec 2007 05:59:49 +0000 Subject: * Added some inter-region comms glue for allowing sims to chat amongst themsevles about an agent behind the agent's back. * Will be using this glue Tomorrow/today to tell other regions what the agent's draw distance is and what region they're actually in so the region can make decisions on what prim to send, if any. --- .../Region/Communications/OGS1/OGS1GridServices.cs | 86 ++++++++++++++++++++++ .../Communications/OGS1/OGS1InterSimComms.cs | 26 +++++++ 2 files changed, 112 insertions(+) (limited to 'OpenSim/Region/Communications/OGS1') diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index 978111f..c556188 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -462,12 +462,83 @@ namespace OpenSim.Region.Communications.OGS1 InterRegionSingleton.Instance.OnPrimGroupArrival += IncomingPrim; InterRegionSingleton.Instance.OnPrimGroupNear += TriggerExpectPrimCrossing; InterRegionSingleton.Instance.OnRegionUp += TriggerRegionUp; + InterRegionSingleton.Instance.OnChildAgentUpdate += TriggerChildAgentUpdate; //InterRegionSingleton.Instance.OnRegionUp += RegionUp; } #region Methods called by regions in this instance + public bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) + { + RegionInfo regInfo = null; + try + { + if (m_localBackend.ChildAgentUpdate(regionHandle, cAgentData)) + { + return true; + } + + regInfo = RequestNeighbourInfo(regionHandle); + if (regInfo != null) + { + //don't want to be creating a new link to the remote instance every time like we are here + bool retValue = false; + + + OGS1InterRegionRemoting remObject = (OGS1InterRegionRemoting)Activator.GetObject( + typeof(OGS1InterRegionRemoting), + "tcp://" + regInfo.RemotingAddress + + ":" + regInfo.RemotingPort + + "/InterRegions"); + + if (remObject != null) + { + retValue = remObject.ChildAgentUpdate(regionHandle, cAgentData); + } + else + { + Console.WriteLine("remoting object not found"); + } + remObject = null; + MainLog.Instance.Verbose("INTER", gdebugRegionName + ": OGS1 tried to Update Child Agent data on outside region and got " + retValue.ToString()); + + return retValue; + } + + return false; + } + catch (RemotingException e) + { + MainLog.Instance.Warn("Remoting Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); + MainLog.Instance.Debug(e.ToString()); + return false; + } + catch (SocketException e) + { + MainLog.Instance.Warn("Socket Error: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); + MainLog.Instance.Debug(e.ToString()); + return false; + } + catch (InvalidCredentialException e) + { + MainLog.Instance.Warn("Invalid Credentials: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); + MainLog.Instance.Debug(e.ToString()); + return false; + } + catch (AuthenticationException e) + { + MainLog.Instance.Warn("Authentication exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); + MainLog.Instance.Debug(e.ToString()); + return false; + } + catch (Exception e) + { + MainLog.Instance.Warn("Unknown exception: Unable to connect to adjacent region: " + regInfo.RegionName + " " + regInfo.RegionLocX + "," + regInfo.RegionLocY); + MainLog.Instance.Debug(e.ToString()); + return false; + } + } /// /// @@ -877,6 +948,21 @@ namespace OpenSim.Region.Communications.OGS1 return false; } } + public bool TriggerChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) + { + MainLog.Instance.Verbose("INTER", "Incoming OGS1 Child Agent Data Update"); + + try + { + return m_localBackend.TriggerChildAgentUpdate(regionHandle, cAgentData); + } + catch (RemotingException e) + { + MainLog.Instance.Error("Remoting Error: Unable to connect to adjacent region.\n" + e.ToString()); + return false; + } + + } /// /// diff --git a/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs index a7636da..683c471 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1InterSimComms.cs @@ -43,6 +43,8 @@ namespace OpenSim.Region.Communications.OGS1 public delegate bool RegionUp (SearializableRegionInfo region, ulong regionhandle); + public delegate bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate childUpdate); + public sealed class InterRegionSingleton { private static readonly InterRegionSingleton instance = new InterRegionSingleton(); @@ -52,6 +54,7 @@ namespace OpenSim.Region.Communications.OGS1 public event InformRegionPrimGroup OnPrimGroupNear; public event PrimGroupArrival OnPrimGroupArrival; public event RegionUp OnRegionUp; + public event ChildAgentUpdate OnChildAgentUpdate; static InterRegionSingleton() @@ -86,6 +89,15 @@ namespace OpenSim.Region.Communications.OGS1 return false; } + public bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentUpdate) + { + if (OnChildAgentUpdate != null) + { + return OnChildAgentUpdate(regionHandle, cAgentUpdate); + } + return false; + } + public bool ExpectAvatarCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying) { if (OnArrival != null) @@ -143,6 +155,20 @@ namespace OpenSim.Region.Communications.OGS1 } } + public bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) + { + try + { + return InterRegionSingleton.Instance.ChildAgentUpdate(regionHandle,cAgentData); + } + catch (RemotingException e) + { + Console.WriteLine("Remoting Error: Unable to send Child agent update to remote region.\n" + e.ToString()); + return false; + } + + } + public bool ExpectAvatarCrossing(ulong regionHandle, Guid agentID, sLLVector3 position, bool isFlying) { try -- cgit v1.1