From 6acf368f5b660380aab7a57a9c09439231170c77 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 16 Sep 2021 17:36:38 +0100 Subject: [PATCH] let osTeleportAgent(key agent, vector position, vector lookat) try teleport to a nearby region is position is outside current region (TEST) --- .../Shared/Api/Implementation/OSSL_Api.cs | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index d5889b3a5e..620368bf39 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -1111,9 +1111,33 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return; } - World.RequestTeleportLocation(presence.ControllingClient, World.RegionInfo.RegionName, position, - lookat, (uint)TPFlags.ViaLocation); - ScriptSleep(500); + RegionInfo ri = World.RegionInfo; + double px = position.x; + double py = position.y; + + if (px >= 0 && px < ri.RegionSizeX && py >= 0 && py < ri.RegionSizeY) + { + World.RequestTeleportLocation(presence.ControllingClient, ri.RegionName, position, + lookat, (uint)TPFlags.ViaLocation); + ScriptSleep(500); + return; + } + + // not in region. lets use global position then. + px += ri.WorldLocX; + py += ri.WorldLocY; + + int gx = (int)px / 256; + int gy = (int)py / 256; + px -= 256 * gx; + py -= 256 * gy; + ulong regionHandle = Util.RegionGridLocToHandle((uint)gx, (uint)gy); + Util.FireAndForget( + o => World.RequestTeleportLocation( + presence.ControllingClient, regionHandle, + new Vector3((float)px, (float)py, (float)position.z), lookat, (uint)TPFlags.ViaLocation), + null, "OSSL_Api.TeleportAgentByFarPos"); + ScriptSleep(5000); } }