From b637a11b58292cb6165317b317dc077a79ee6779 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Fri, 6 Mar 2009 23:01:35 +0000 Subject: Fixes Mantis #3260. Thank you kindly, MCortez for a patch that: llSetHoverHeight() should not clamp the x/y position of an object the way MoveTo does, and it should recalculate the absolute height to hover at as an object moves to reflect the current ground/water height under it. Correctly implementing required adjusting the Physics interfaces and implementing at the physics plug-in level. The attached is a patch that correctly implements llSetHoverHeight() including updates to the ODE physics plug-in. --- .../Shared/Api/Implementation/LSL_Api.cs | 29 ++++++++++------------ 1 file changed, 13 insertions(+), 16 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Shared') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 517453e..62b52f2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2793,26 +2793,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } } + /// + /// Attempt to clamp the object on the Z axis at the given height over tau seconds. + /// + /// Height to hover. Height of zero disables hover. + /// False if height is calculated just from ground, otherwise uses ground or water depending on whichever is higher + /// Number of seconds over which to reach target public void llSetHoverHeight(double height, int water, double tau) { m_host.AddScriptLPS(1); - Vector3 pos = m_host.GetWorldPosition(); - int x = (int)(pos.X); - int y = (int)(pos.Y); - float landHeight = (float)World.Heightmap[x, y]; - float targetHeight = landHeight + (float)height; - if (water == 1) + if (m_host.PhysActor != null) { - float waterHeight = (float)World.RegionInfo.RegionSettings.WaterHeight; - if (waterHeight > targetHeight) + PIDHoverType hoverType = PIDHoverType.Ground; + if (water == 1) { - targetHeight = waterHeight + (float)height; + hoverType = PIDHoverType.GroundAndWater; } - } - if (m_host.PhysActor != null) - { - m_host.MoveToTarget(new Vector3(pos.X, pos.Y, targetHeight), (float)tau); - m_host.PhysActor.Flying = true; + + m_host.SetHoverHeight((float)height, hoverType, (float)tau); } } @@ -2821,8 +2819,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); if (m_host.PhysActor != null) { - m_host.PhysActor.Flying = false; - m_host.PhysActor.PIDActive = false; + m_host.SetHoverHeight(0f, PIDHoverType.Ground, 0f); } } -- cgit v1.1