diff options
Diffstat (limited to '')
6 files changed, 69 insertions, 38 deletions
diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs index ea89db3..e399e27 100644 --- a/OpenSim/Framework/Constants.cs +++ b/OpenSim/Framework/Constants.cs | |||
@@ -63,6 +63,7 @@ namespace OpenSim.Framework | |||
63 | EstateManagers = 10 | 63 | EstateManagers = 10 |
64 | } | 64 | } |
65 | 65 | ||
66 | // Identical to the one in OpenMetaverse, except I'm extending it now, and OpenSim decided to copy it here, making life hard. | ||
66 | [Flags]public enum TeleportFlags : uint | 67 | [Flags]public enum TeleportFlags : uint |
67 | { | 68 | { |
68 | /// <summary>No flags set, or teleport failed</summary> | 69 | /// <summary>No flags set, or teleport failed</summary> |
@@ -75,7 +76,7 @@ namespace OpenSim.Framework | |||
75 | ViaLure = 1 << 2, | 76 | ViaLure = 1 << 2, |
76 | /// <summary>Via Landmark</summary> | 77 | /// <summary>Via Landmark</summary> |
77 | ViaLandmark = 1 << 3, | 78 | ViaLandmark = 1 << 3, |
78 | /// <summary>Via Location</summary> | 79 | /// <summary>Via Location, seems to be a catch all, includes scripted TPs.</summary> |
79 | ViaLocation = 1 << 4, | 80 | ViaLocation = 1 << 4, |
80 | /// <summary>Via Home</summary> | 81 | /// <summary>Via Home</summary> |
81 | ViaHome = 1 << 5, | 82 | ViaHome = 1 << 5, |
@@ -99,6 +100,10 @@ namespace OpenSim.Framework | |||
99 | ResetHome = 1 << 14, | 100 | ResetHome = 1 << 14, |
100 | /// <summary>forced to new location for example when avatar is banned or ejected</summary> | 101 | /// <summary>forced to new location for example when avatar is banned or ejected</summary> |
101 | ForceRedirect = 1 << 15, | 102 | ForceRedirect = 1 << 15, |
103 | /// <summary>Via script.</summary> | ||
104 | ViaScript = 1 << 16, | ||
105 | /// <summary>Via map, though this is a guess.</summary> | ||
106 | ViaMap = 1 << 17, | ||
102 | /// <summary>Teleport Finished via a Lure</summary> | 107 | /// <summary>Teleport Finished via a Lure</summary> |
103 | FinishedViaLure = 1 << 26, | 108 | FinishedViaLure = 1 << 26, |
104 | /// <summary>Finished, Sim Changed</summary> | 109 | /// <summary>Finished, Sim Changed</summary> |
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index fa49546..9970132 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -673,9 +673,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
673 | 673 | ||
674 | string homeURI = Scene.GetAgentHomeURI(sp.ControllingClient.AgentId); | 674 | string homeURI = Scene.GetAgentHomeURI(sp.ControllingClient.AgentId); |
675 | 675 | ||
676 | m_log.DebugFormat( | 676 | //// m_log.DebugFormat( |
677 | "[ENTITY TRANSFER MODULE]: Teleporting {0} {1} from {2} to {3} ({4}) {5}/{6}", | 677 | m_log.InfoFormat( |
678 | sp.Name, sp.UUID, sp.Scene.RegionInfo.RegionName, | 678 | "[ENTITY TRANSFER MODULE]: Teleporting {0} {1} from {2}/{3} to {4} ({5}) {6}/{7}", |
679 | sp.Name, sp.UUID, sp.Scene.RegionInfo.RegionName, sp.AbsolutePosition, | ||
679 | reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); | 680 | reg.ServerURI, finalDestination.ServerURI, finalDestination.RegionName, position); |
680 | 681 | ||
681 | RegionInfo sourceRegion = sp.Scene.RegionInfo; | 682 | RegionInfo sourceRegion = sp.Scene.RegionInfo; |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 0d8f286..e84018e 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -1406,15 +1406,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
1406 | if (groundHeight > pos.Z) | 1406 | if (groundHeight > pos.Z) |
1407 | pos.Z = groundHeight; | 1407 | pos.Z = groundHeight; |
1408 | 1408 | ||
1409 | if (((m_teleportFlags & TeleportFlags.ViaMap) == 0) && (Math.Truncate(pos.Z) == pos.Z)) | ||
1410 | m_teleportFlags |= TeleportFlags.ViaMap; | ||
1409 | bool checkPhysics = !positionChanged && | 1411 | bool checkPhysics = !positionChanged && |
1410 | m_scene.SupportsRayCastFiltered() && | 1412 | m_scene.SupportsRayCastFiltered() && |
1411 | pos.Z < physTestHeight && | 1413 | pos.Z < physTestHeight && |
1412 | ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) == | 1414 | ((m_teleportFlags & (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID)) == |
1413 | (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) | 1415 | (TeleportFlags.ViaLogin | TeleportFlags.ViaRegionID) |
1414 | || (m_teleportFlags & TeleportFlags.ViaLocation) != 0 | 1416 | //// || (m_teleportFlags & TeleportFlags.ViaLocation) != 0 |
1417 | || (m_teleportFlags & TeleportFlags.ViaMap) != 0 | ||
1415 | || (m_teleportFlags & TeleportFlags.ViaHGLogin) != 0); | 1418 | || (m_teleportFlags & TeleportFlags.ViaHGLogin) != 0); |
1416 | 1419 | ||
1417 | if(checkPhysics) | 1420 | if(checkPhysics && ((m_teleportFlags & TeleportFlags.ViaScript) == 0) && ((m_teleportFlags & TeleportFlags.ViaHome) == 0)) |
1418 | { | 1421 | { |
1419 | // land check was done above | 1422 | // land check was done above |
1420 | RayFilterFlags rayfilter = RayFilterFlags.BackFaceCull; | 1423 | RayFilterFlags rayfilter = RayFilterFlags.BackFaceCull; |
@@ -1443,29 +1446,49 @@ namespace OpenSim.Region.Framework.Scenes | |||
1443 | return a.Depth.CompareTo(b.Depth); | 1446 | return a.Depth.CompareTo(b.Depth); |
1444 | }); | 1447 | }); |
1445 | 1448 | ||
1446 | int sel = 0; | 1449 | int sel = -1; |
1447 | int count = physresults.Count; | 1450 | int count = physresults.Count; |
1448 | float curd = physresults[0].Depth; | 1451 | float curd = physresults[0].Depth; |
1449 | float nextd = curd + PhysMinSkipGap; | 1452 | float nextd = curd + PhysMinSkipGap; |
1450 | float maxDepth = dist - pos.Z; | 1453 | float maxDepth = dist - pos.Z; |
1451 | for(int i = 1; i < count; i++) | 1454 | // Try to find a designated floor. |
1455 | for(int i = 0; i < count; i++) | ||
1452 | { | 1456 | { |
1453 | curd = physresults[i].Depth; | 1457 | SceneObjectPart part = m_scene.GetSceneObjectPart(physresults[i].ConsumerID); |
1454 | if(curd >= nextd) | 1458 | if ((null != part) && (string.Empty != part.Description) && ('^' == part.Description[0])) |
1455 | { | 1459 | { |
1456 | sel = i; | 1460 | sel = i; |
1457 | if(curd >= maxDepth || curd >= nextd + PhysSkipGapDelta) | 1461 | dest = physresults[sel].Pos.Z; |
1458 | break; | 1462 | break; |
1459 | } | 1463 | } |
1460 | nextd = curd + PhysMinSkipGap; | 1464 | } |
1465 | |||
1466 | if (-1 == sel) | ||
1467 | { | ||
1468 | sel = 0; | ||
1469 | for (int i = 1; i < count; i++) | ||
1470 | { | ||
1471 | curd = physresults[i].Depth; | ||
1472 | if(curd >= nextd) | ||
1473 | { | ||
1474 | sel = i; | ||
1475 | if(curd >= maxDepth || curd >= nextd + PhysSkipGapDelta) | ||
1476 | break; | ||
1477 | } | ||
1478 | nextd = curd + PhysMinSkipGap; | ||
1479 | } | ||
1480 | dest = physresults[sel].Pos.Z; | ||
1461 | } | 1481 | } |
1462 | dest = physresults[sel].Pos.Z; | ||
1463 | } | 1482 | } |
1464 | 1483 | ||
1465 | dest += localAVHalfHeight; | 1484 | dest += localAVHalfHeight; |
1466 | if(dest > pos.Z) | 1485 | if ((m_teleportFlags & TeleportFlags.ViaMap) != 0) |
1467 | pos.Z = dest; | 1486 | m_log.InfoFormat("[SCENE PRESENCE]: Teleport from above, for {0} @ {1}, landing height {2}", Name, pos, dest); |
1468 | break; | 1487 | else |
1488 | m_log.ErrorFormat("[SCENE PRESENCE]: Teleport from above NOMAP, for {0} @ {1}, landing height {2}", Name, pos, dest); | ||
1489 | if(dest > pos.Z) | ||
1490 | pos.Z = dest; | ||
1491 | break; | ||
1469 | } | 1492 | } |
1470 | } | 1493 | } |
1471 | 1494 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index c9ee28e..10afe99 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -5245,7 +5245,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5245 | 5245 | ||
5246 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0) | 5246 | if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0) |
5247 | { | 5247 | { |
5248 | World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); | 5248 | World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)(Constants.TeleportFlags.ViaLocation | Constants.TeleportFlags.ViaScript)); |
5249 | } | 5249 | } |
5250 | } | 5250 | } |
5251 | } | 5251 | } |
@@ -5259,7 +5259,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5259 | // Use it as a sim name | 5259 | // Use it as a sim name |
5260 | if (assetID == UUID.Zero) | 5260 | if (assetID == UUID.Zero) |
5261 | { | 5261 | { |
5262 | World.RequestTeleportLocation(sp.ControllingClient, destination, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); | 5262 | World.RequestTeleportLocation(sp.ControllingClient, destination, targetPos, targetLookAt, (uint)(Constants.TeleportFlags.ViaLocation | Constants.TeleportFlags.ViaScript)); |
5263 | return; | 5263 | return; |
5264 | } | 5264 | } |
5265 | 5265 | ||
@@ -5272,7 +5272,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5272 | 5272 | ||
5273 | AssetLandmark lm = new AssetLandmark(lma); | 5273 | AssetLandmark lm = new AssetLandmark(lma); |
5274 | 5274 | ||
5275 | World.RequestTeleportLocation(sp.ControllingClient, lm.RegionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); | 5275 | World.RequestTeleportLocation(sp.ControllingClient, lm.RegionHandle, targetPos, targetLookAt, (uint)(Constants.TeleportFlags.ViaLocation | Constants.TeleportFlags.ViaScript)); |
5276 | } | 5276 | } |
5277 | 5277 | ||
5278 | public void llTextBox(string agent, string message, int chatChannel) | 5278 | public void llTextBox(string agent, string message, int chatChannel) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index d268609..48f9d0b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -1071,7 +1071,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1071 | Util.FireAndForget( | 1071 | Util.FireAndForget( |
1072 | o => World.RequestTeleportLocation( | 1072 | o => World.RequestTeleportLocation( |
1073 | presence.ControllingClient, regionName, position, | 1073 | presence.ControllingClient, regionName, position, |
1074 | lookat, (uint)TPFlags.ViaLocation), | 1074 | lookat, (uint)(TPFlags.ViaLocation | TPFlags.ViaScript)), |
1075 | null, "OSSL_Api.TeleportAgentByRegionCoords"); | 1075 | null, "OSSL_Api.TeleportAgentByRegionCoords"); |
1076 | ScriptSleep(5000); | 1076 | ScriptSleep(5000); |
1077 | } | 1077 | } |
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs index 7aa18b1..06e3d8d 100644 --- a/OpenSim/Services/LLLoginService/LLLoginService.cs +++ b/OpenSim/Services/LLLoginService/LLLoginService.cs | |||
@@ -534,7 +534,7 @@ namespace OpenSim.Services.LLLoginService | |||
534 | Vector3 position = Vector3.Zero; | 534 | Vector3 position = Vector3.Zero; |
535 | Vector3 lookAt = Vector3.Zero; | 535 | Vector3 lookAt = Vector3.Zero; |
536 | GridRegion gatekeeper = null; | 536 | GridRegion gatekeeper = null; |
537 | TeleportFlags flags; | 537 | Constants.TeleportFlags flags; |
538 | GridRegion destination = FindDestination(account, scopeID, guinfo, session, startLocation, home, out gatekeeper, out where, out position, out lookAt, out flags); | 538 | GridRegion destination = FindDestination(account, scopeID, guinfo, session, startLocation, home, out gatekeeper, out where, out position, out lookAt, out flags); |
539 | if (destination == null) | 539 | if (destination == null) |
540 | { | 540 | { |
@@ -553,7 +553,7 @@ namespace OpenSim.Services.LLLoginService | |||
553 | } | 553 | } |
554 | 554 | ||
555 | if (account.UserLevel >= 200) | 555 | if (account.UserLevel >= 200) |
556 | flags |= TeleportFlags.Godlike; | 556 | flags |= Constants.TeleportFlags.Godlike; |
557 | // | 557 | // |
558 | // Get the avatar | 558 | // Get the avatar |
559 | // | 559 | // |
@@ -627,9 +627,9 @@ namespace OpenSim.Services.LLLoginService | |||
627 | protected GridRegion FindDestination( | 627 | protected GridRegion FindDestination( |
628 | UserAccount account, UUID scopeID, GridUserInfo pinfo, UUID sessionID, string startLocation, | 628 | UserAccount account, UUID scopeID, GridUserInfo pinfo, UUID sessionID, string startLocation, |
629 | GridRegion home, out GridRegion gatekeeper, | 629 | GridRegion home, out GridRegion gatekeeper, |
630 | out string where, out Vector3 position, out Vector3 lookAt, out TeleportFlags flags) | 630 | out string where, out Vector3 position, out Vector3 lookAt, out Constants.TeleportFlags flags) |
631 | { | 631 | { |
632 | flags = TeleportFlags.ViaLogin; | 632 | flags = Constants.TeleportFlags.ViaLogin; |
633 | 633 | ||
634 | m_log.DebugFormat( | 634 | m_log.DebugFormat( |
635 | "[LLOGIN SERVICE]: Finding destination matching start location {0} for {1}", | 635 | "[LLOGIN SERVICE]: Finding destination matching start location {0} for {1}", |
@@ -663,7 +663,7 @@ namespace OpenSim.Services.LLLoginService | |||
663 | 663 | ||
664 | position = pinfo.HomePosition; | 664 | position = pinfo.HomePosition; |
665 | lookAt = pinfo.HomeLookAt; | 665 | lookAt = pinfo.HomeLookAt; |
666 | flags |= TeleportFlags.ViaHome; | 666 | flags |= Constants.TeleportFlags.ViaHome; |
667 | } | 667 | } |
668 | 668 | ||
669 | if (tryDefaults) | 669 | if (tryDefaults) |
@@ -671,7 +671,7 @@ namespace OpenSim.Services.LLLoginService | |||
671 | List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); | 671 | List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); |
672 | if (defaults != null && defaults.Count > 0) | 672 | if (defaults != null && defaults.Count > 0) |
673 | { | 673 | { |
674 | flags |= TeleportFlags.ViaRegionID; | 674 | flags |= Constants.TeleportFlags.ViaRegionID; |
675 | region = defaults[0]; | 675 | region = defaults[0]; |
676 | where = "safe"; | 676 | where = "safe"; |
677 | } | 677 | } |
@@ -682,7 +682,7 @@ namespace OpenSim.Services.LLLoginService | |||
682 | region = FindAlternativeRegion(scopeID); | 682 | region = FindAlternativeRegion(scopeID); |
683 | if (region != null) | 683 | if (region != null) |
684 | { | 684 | { |
685 | flags |= TeleportFlags.ViaRegionID; | 685 | flags |= Constants.TeleportFlags.ViaRegionID; |
686 | where = "safe"; | 686 | where = "safe"; |
687 | } | 687 | } |
688 | } | 688 | } |
@@ -705,7 +705,7 @@ namespace OpenSim.Services.LLLoginService | |||
705 | List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); | 705 | List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID); |
706 | if (defaults != null && defaults.Count > 0) | 706 | if (defaults != null && defaults.Count > 0) |
707 | { | 707 | { |
708 | flags |= TeleportFlags.ViaRegionID; | 708 | flags |= Constants.TeleportFlags.ViaRegionID; |
709 | region = defaults[0]; | 709 | region = defaults[0]; |
710 | where = "safe"; | 710 | where = "safe"; |
711 | } | 711 | } |
@@ -715,7 +715,7 @@ namespace OpenSim.Services.LLLoginService | |||
715 | region = FindAlternativeRegion(scopeID); | 715 | region = FindAlternativeRegion(scopeID); |
716 | if (region != null) | 716 | if (region != null) |
717 | { | 717 | { |
718 | flags |= TeleportFlags.ViaRegionID; | 718 | flags |= Constants.TeleportFlags.ViaRegionID; |
719 | where = "safe"; | 719 | where = "safe"; |
720 | } | 720 | } |
721 | } | 721 | } |
@@ -730,7 +730,7 @@ namespace OpenSim.Services.LLLoginService | |||
730 | } | 730 | } |
731 | else | 731 | else |
732 | { | 732 | { |
733 | flags |= TeleportFlags.ViaRegionID; | 733 | flags |= Constants.TeleportFlags.ViaRegionID; |
734 | 734 | ||
735 | // free uri form | 735 | // free uri form |
736 | // e.g. New Moon&135&46 New Moon@osgrid.org:8002&153&34 | 736 | // e.g. New Moon&135&46 New Moon@osgrid.org:8002&153&34 |
@@ -748,6 +748,8 @@ namespace OpenSim.Services.LLLoginService | |||
748 | position = new Vector3(float.Parse(uriMatch.Groups["x"].Value, Culture.NumberFormatInfo), | 748 | position = new Vector3(float.Parse(uriMatch.Groups["x"].Value, Culture.NumberFormatInfo), |
749 | float.Parse(uriMatch.Groups["y"].Value, Culture.NumberFormatInfo), | 749 | float.Parse(uriMatch.Groups["y"].Value, Culture.NumberFormatInfo), |
750 | float.Parse(uriMatch.Groups["z"].Value, Culture.NumberFormatInfo)); | 750 | float.Parse(uriMatch.Groups["z"].Value, Culture.NumberFormatInfo)); |
751 | if (0 == position.Z) | ||
752 | flags |= Constants.TeleportFlags.ViaMap; | ||
751 | 753 | ||
752 | string regionName = uriMatch.Groups["region"].ToString(); | 754 | string regionName = uriMatch.Groups["region"].ToString(); |
753 | if (regionName != null) | 755 | if (regionName != null) |
@@ -900,7 +902,7 @@ namespace OpenSim.Services.LLLoginService | |||
900 | 902 | ||
901 | protected AgentCircuitData LaunchAgentAtGrid(GridRegion gatekeeper, GridRegion destination, UserAccount account, AvatarAppearance avatar, | 903 | protected AgentCircuitData LaunchAgentAtGrid(GridRegion gatekeeper, GridRegion destination, UserAccount account, AvatarAppearance avatar, |
902 | UUID session, UUID secureSession, Vector3 position, string currentWhere, string viewer, string channel, string mac, string id0, | 904 | UUID session, UUID secureSession, Vector3 position, string currentWhere, string viewer, string channel, string mac, string id0, |
903 | IPEndPoint clientIP, TeleportFlags flags, out string where, out string reason, out GridRegion dest) | 905 | IPEndPoint clientIP, Constants.TeleportFlags flags, out string where, out string reason, out GridRegion dest) |
904 | { | 906 | { |
905 | where = currentWhere; | 907 | where = currentWhere; |
906 | ISimulationService simConnector = null; | 908 | ISimulationService simConnector = null; |
@@ -937,7 +939,7 @@ namespace OpenSim.Services.LLLoginService | |||
937 | { | 939 | { |
938 | foreach (GridRegion r in fallbacks) | 940 | foreach (GridRegion r in fallbacks) |
939 | { | 941 | { |
940 | success = LaunchAgentDirectly(simConnector, r, aCircuit, flags | TeleportFlags.ViaRegionID, out reason); | 942 | success = LaunchAgentDirectly(simConnector, r, aCircuit, flags | Constants.TeleportFlags.ViaRegionID | Constants.TeleportFlags.ViaMap, out reason); |
941 | if (success) | 943 | if (success) |
942 | { | 944 | { |
943 | where = "safe"; | 945 | where = "safe"; |
@@ -1083,7 +1085,7 @@ namespace OpenSim.Services.LLLoginService | |||
1083 | 1085 | ||
1084 | } | 1086 | } |
1085 | 1087 | ||
1086 | private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason) | 1088 | private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, Constants.TeleportFlags flags, out string reason) |
1087 | { | 1089 | { |
1088 | EntityTransferContext ctx = new EntityTransferContext(); | 1090 | EntityTransferContext ctx = new EntityTransferContext(); |
1089 | 1091 | ||