diff options
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 7a6ed5c..57f9d01 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2472,35 +2472,44 @@ namespace OpenSim.Region.Framework.Scenes | |||
2472 | // } | 2472 | // } |
2473 | 2473 | ||
2474 | // Get terrain height for sub-region in a megaregion if necessary | 2474 | // Get terrain height for sub-region in a megaregion if necessary |
2475 | int X = (int)((m_scene.RegionInfo.WorldLocX) + pos.X); | ||
2476 | int Y = (int)((m_scene.RegionInfo.WorldLocY) + pos.Y); | ||
2477 | GridRegion target_region = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, X, Y); | ||
2478 | // If X and Y is NaN, target_region will be null | ||
2479 | if (target_region == null) | ||
2480 | return; | ||
2481 | UUID target_regionID = target_region.RegionID; | ||
2482 | Scene targetScene = m_scene; | ||
2483 | |||
2484 | if (!SceneManager.Instance.TryGetScene(target_regionID, out targetScene)) | ||
2485 | targetScene = m_scene; | ||
2486 | |||
2487 | float terrainHeight = (float)targetScene.Heightmap[(int)(pos.X % regionSize.X), (int)(pos.Y % regionSize.Y)]; | ||
2488 | pos.Z = Math.Max(terrainHeight, pos.Z); | ||
2489 | 2475 | ||
2490 | // Fudge factor. It appears that if one clicks "go here" on a piece of ground, the go here request is | 2476 | //COMMENT: If its only nessesary in a megaregion, why do it on normal region's too? |
2491 | // always slightly higher than the actual terrain height. | 2477 | |
2492 | // FIXME: This constrains NPC movements as well, so should be somewhere else. | 2478 | if (regionCombinerModule != null) |
2493 | if (pos.Z - terrainHeight < 0.2) | 2479 | { |
2494 | pos.Z = terrainHeight; | 2480 | int X = (int)((m_scene.RegionInfo.WorldLocX) + pos.X); |
2481 | int Y = (int)((m_scene.RegionInfo.WorldLocY) + pos.Y); | ||
2482 | GridRegion target_region = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, X, Y); | ||
2483 | // If X and Y is NaN, target_region will be null | ||
2484 | if (target_region == null) | ||
2485 | return; | ||
2486 | UUID target_regionID = target_region.RegionID; | ||
2487 | Scene targetScene = m_scene; | ||
2488 | |||
2489 | if (!SceneManager.Instance.TryGetScene(target_regionID, out targetScene)) | ||
2490 | targetScene = m_scene; | ||
2491 | |||
2492 | float terrainHeight = (float)targetScene.Heightmap[(int)(pos.X % regionSize.X), (int)(pos.Y % regionSize.Y)]; | ||
2493 | pos.Z = Math.Max(terrainHeight, pos.Z); | ||
2494 | |||
2495 | // Fudge factor. It appears that if one clicks "go here" on a piece of ground, the go here request is | ||
2496 | // always slightly higher than the actual terrain height. | ||
2497 | // FIXME: This constrains NPC movements as well, so should be somewhere else. | ||
2498 | if (pos.Z - terrainHeight < 0.2) | ||
2499 | pos.Z = terrainHeight; | ||
2500 | |||
2501 | if (noFly) | ||
2502 | Flying = false; | ||
2503 | else if (pos.Z > terrainHeight) | ||
2504 | Flying = true; | ||
2505 | } | ||
2495 | 2506 | ||
2496 | // m_log.DebugFormat( | 2507 | // m_log.DebugFormat( |
2497 | // "[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}", | 2508 | // "[SCENE PRESENCE]: Avatar {0} set move to target {1} (terrain height {2}) in {3}", |
2498 | // Name, pos, terrainHeight, m_scene.RegionInfo.RegionName); | 2509 | // Name, pos, terrainHeight, m_scene.RegionInfo.RegionName); |
2499 | 2510 | ||
2500 | if (noFly) | 2511 | if (noFly) |
2501 | Flying = false; | 2512 | Flying = false; |
2502 | else if (pos.Z > terrainHeight) | ||
2503 | Flying = true; | ||
2504 | 2513 | ||
2505 | LandAtTarget = landAtTarget; | 2514 | LandAtTarget = landAtTarget; |
2506 | MovingToTarget = true; | 2515 | MovingToTarget = true; |