mirror of
https://github.com/opensim/opensim.git
synced 2026-08-05 00:46:02 +08:00
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.
This commit is contained in:
@@ -2793,26 +2793,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Attempt to clamp the object on the Z axis at the given height over tau seconds.
|
||||
/// </summary>
|
||||
/// <param name="height">Height to hover. Height of zero disables hover.</param>
|
||||
/// <param name="water">False if height is calculated just from ground, otherwise uses ground or water depending on whichever is higher</param>
|
||||
/// <param name="tau">Number of seconds over which to reach target</param>
|
||||
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)
|
||||
{
|
||||
float waterHeight = (float)World.RegionInfo.RegionSettings.WaterHeight;
|
||||
if (waterHeight > targetHeight)
|
||||
{
|
||||
targetHeight = waterHeight + (float)height;
|
||||
}
|
||||
}
|
||||
if (m_host.PhysActor != null)
|
||||
{
|
||||
m_host.MoveToTarget(new Vector3(pos.X, pos.Y, targetHeight), (float)tau);
|
||||
m_host.PhysActor.Flying = true;
|
||||
PIDHoverType hoverType = PIDHoverType.Ground;
|
||||
if (water == 1)
|
||||
{
|
||||
hoverType = PIDHoverType.GroundAndWater;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user