From bc590c2fc4a0965a110c01688fbec14913d5875d Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 19 Dec 2021 01:54:29 +0000 Subject: [PATCH] NeighbourHandler child agents distances control --- .../EntityTransfer/EntityTransferModule.cs | 15 ++++- OpenSim/Region/Framework/Scenes/Scene.cs | 64 +++++++++++-------- OpenSim/Server/Handlers/Base/Utils.cs | 5 +- 3 files changed, 53 insertions(+), 31 deletions(-) diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 4dbcb00379..fad89f2fb5 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -1938,10 +1938,21 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer /// /// public void EnableChildAgent(ScenePresence sp, GridRegion region) - { + { + int viewrange =(int) sp.RegionViewDistance; + Vector3 pos = sp.AbsolutePosition; + RegionInfo curregion = sp.Scene.RegionInfo; + + int rtmp = region.RegionLocX - (int)Util.RegionToWorldLoc(curregion.RegionLocX) - (int)pos.X; + if (rtmp < -(viewrange + region.RegionSizeX) || rtmp > viewrange + curregion.RegionSizeX) + return; + rtmp = region.RegionLocY - (int)Util.RegionToWorldLoc(curregion.RegionLocY) - (int)pos.Y; + if (rtmp < -(viewrange + region.RegionSizeY) || rtmp > viewrange + curregion.RegionSizeY) + return; + m_log.DebugFormat("[ENTITY TRANSFER]: Enabling child agent in new neighbour {0}", region.RegionName); - ulong currentRegionHandler = sp.Scene.RegionInfo.RegionHandle; + ulong currentRegionHandler = curregion.RegionHandle; ulong regionhandler = region.RegionHandle; Dictionary seeds = new Dictionary(sp.Scene.CapsModule.GetChildrenSeeds(sp.UUID)); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 3d9e10f5bc..780e96317d 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1377,22 +1377,29 @@ namespace OpenSim.Region.Framework.Scenes { // Let the grid service module know, so this can be cached m_eventManager.TriggerOnRegionUp(otherRegion); - - try + if (EntityTransferModule != null) { - ForEachRootScenePresence(delegate(ScenePresence agent) + try { - List old = new List() {otherRegion.RegionHandle}; - agent.DropOldNeighbours(old); - if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc) + List old = new List() { otherRegion.RegionHandle }; + ForEachRootScenePresence(delegate(ScenePresence agent) + { + if(agent.IsNPC) + return; + + agent.DropOldNeighbours(old); + + if(agent.RegionViewDistance == 0) + return; + EntityTransferModule.EnableChildAgent(agent, otherRegion); - }); - } - catch (NullReferenceException) - { - // This means that we're not booted up completely yet. - // This shouldn't happen too often anymore. - m_log.Error("[SCENE]: Couldn't inform client of regionup because we got a null reference exception"); + }); + } + catch + { + m_log.Error("[SCENE]: Couldn't inform clients of regionup"); + + } } } else @@ -1408,12 +1415,12 @@ namespace OpenSim.Region.Framework.Scenes { int tmp = otherRegion.RegionLocX - (int)RegionInfo.WorldLocX; - if (tmp < -otherRegion.RegionSizeX && tmp > RegionInfo.RegionSizeX) + if (tmp < -otherRegion.RegionSizeX || tmp > RegionInfo.RegionSizeX) return false; tmp = otherRegion.RegionLocY - (int)RegionInfo.WorldLocY; - if (tmp < -otherRegion.RegionSizeY && tmp > RegionInfo.RegionSizeY) + if (tmp < -otherRegion.RegionSizeY || tmp > RegionInfo.RegionSizeY) return false; return true; @@ -1484,21 +1491,24 @@ namespace OpenSim.Region.Framework.Scenes m_restartWaitTimer.Stop(); lock (m_regionRestartNotifyList) { - foreach (RegionInfo region in m_regionRestartNotifyList) + if(EntityTransferModule != null) { - GridRegion r = new GridRegion(region); - try + foreach (RegionInfo region in m_regionRestartNotifyList) { - ForEachRootScenePresence(delegate(ScenePresence agent) + GridRegion r = new GridRegion(region); + try { - if (EntityTransferModule != null && agent.PresenceType != PresenceType.Npc) - EntityTransferModule.EnableChildAgent(agent, r); - }); - } - catch (NullReferenceException) - { - // This means that we're not booted up completely yet. - // This shouldn't happen too often anymore. + ForEachRootScenePresence(delegate(ScenePresence agent) + { + if (!agent.IsNPC) + EntityTransferModule.EnableChildAgent(agent, r); + }); + } + catch (NullReferenceException) + { + // This means that we're not booted up completely yet. + // This shouldn't happen too often anymore. + } } } diff --git a/OpenSim/Server/Handlers/Base/Utils.cs b/OpenSim/Server/Handlers/Base/Utils.cs index 3b1fb01612..dff049b52b 100644 --- a/OpenSim/Server/Handlers/Base/Utils.cs +++ b/OpenSim/Server/Handlers/Base/Utils.cs @@ -40,8 +40,9 @@ namespace OpenSim.Server.Handlers.Base /// /// Extract the param from an uri. /// - /// Something like this: /xxxx/uuid/ or /uuid/handle/release - /// uuid on uuid field + /// Something like this: /xxxx/uuid/ or /xxxx/uuid/handle/release + /// uuid on uuid field + /// optional regionHandle /// optional action public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action) {