From e8735b699791e842e3d92906bb3b0f6aeb7227e7 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 16 Sep 2021 18:39:32 +0100 Subject: [PATCH] region handle things --- OpenSim/Framework/Util.cs | 42 +++++++++++++++++++ .../EntityTransfer/EntityTransferModule.cs | 10 ++--- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index c0ad22eaed..9a7ea80e26 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -446,6 +446,48 @@ namespace OpenSim.Framework return regionCoord << 8; } + public static bool CompareRegionHandles(ulong handle, Vector3 handleOffset, RegionInfo region, out Vector3 regionOffset) + { + RegionHandleToWorldLoc(handle, out uint uhX, out uint uhY); + double px = uhX - region.WorldLocX + (double)handleOffset.X; + double py = uhY - region.WorldLocY + (double)handleOffset.Y; + if (px >= 0 && px < region.RegionSizeX && py >= 0 && py < region.RegionSizeY) + { + regionOffset = new Vector3((float)px, (float)py, handleOffset.Z); + return true; + } + regionOffset = Vector3.Zero; + return false; + } + + public static bool CompareRegionHandler(ulong handle, Vector3 handleOffset, ulong regionhandle, int regionSizeX, int regionSizeY, out Vector3 regionOffset) + { + RegionHandleToWorldLoc(handle, out uint uhX, out uint uhY); + RegionHandleToWorldLoc(regionhandle, out uint urX, out uint urY); + double px = uhX - urX + (double)handleOffset.X; + double py = uhY - urY + (double)handleOffset.Y; + if (px >= 0 && px < regionSizeX && py >= 0 && py < regionSizeY) + { + regionOffset = new Vector3((float)px, (float)py, handleOffset.Z); + return true; + } + regionOffset = Vector3.Zero; + return false; + } + + public static bool CompareRegionHandlers(ulong handle, Vector3 handleOffset, int regionX, int regionY, int regionSizeX, int regionSizeY, out Vector3 regionOffset) + { + RegionHandleToWorldLoc(handle, out uint uhX, out uint uhY); + double px = uhX - regionX + (double)handleOffset.X; + double py = uhY - regionY + (double)handleOffset.Y; + if (px >= 0 && px < regionSizeX && py >= 0 && py < regionSizeY) + { + regionOffset = new Vector3((float)px, (float)py, handleOffset.Z); + return true; + } + regionOffset = Vector3.Zero; + return false; + } public static bool checkServiceURI(string uristr, out string serviceURI, out string serviceHost, out string serviceIPstr) { diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 04572a2aca..74ac00e0f5 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs @@ -425,9 +425,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } + RegionInfo spRi = sp.Scene.RegionInfo; try { - if (regionHandle == sp.Scene.RegionInfo.RegionHandle) + if (Util.CompareRegionHandles(regionHandle, position, spRi, out Vector3 roffset)) { if(!sp.AllowMovement) { @@ -436,9 +437,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer return; } - destinationRegionName = sp.Scene.RegionInfo.RegionName; - - TeleportAgentWithinRegion(sp, position, lookAt, teleportFlags); + destinationRegionName = spRi.RegionName; + TeleportAgentWithinRegion(sp, roffset, lookAt, teleportFlags); } else // Another region possibly in another simulator { @@ -508,7 +508,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer float posZLimit = 22; // TODO: Check other Scene HeightField - posZLimit = (float)sp.Scene.Heightmap[(int)position.X, (int)position.Y]; + posZLimit = sp.Scene.Heightmap[(int)position.X, (int)position.Y]; posZLimit += localHalfAVHeight + 0.1f;