Difference between revisions of "LlWater"

From Second Life Wiki
Jump to: navigation, search
Line 11: Line 11:
 
|constants
 
|constants
 
|examples=<pre>
 
|examples=<pre>
// by Konigmann Lippmann
+
// by Konigmann Lippmann & Strife Onizuka
 
FindGroundOrWater()
 
FindGroundOrWater()
 
{
 
{
    //llSay(0, "Finding Ground.");
+
     float fHeight = llGround( ZERO_VECTOR );
     float fGroundHeight = llGround( <0,0,0> );
+
     float fWaterLevel = llWater( ZERO_VECTOR );
     float fWaterLevel = llWater( <0,0,0> );
+
     if( fHeight < fWaterLevel )
     integer iRepeats = 0;
+
        fHeight = fWaterLevel;
if( fGroundHeight < fWaterLevel )
+
     vector vTarget = llGetPos();
fGroundHeight = fWaterLevel;
+
 
     vector vOldPosition = llGetPos();
+
     //llSetPos can only move 10m at a time.
    vector vNewPosition = vOldPosition;
+
     integer iCounter = 1 + llAbs((integer)(vTarget.z - fHeight) / 10);
     vNewPosition.z = fGroundHeight;
+
    vTarget.z = fHeight;
     //llSay(0, "New location should be:" + (string)vNewPosition );
+
     do
    while( (llAbs((integer)(vOldPosition.z - vNewPosition.z)) > 2.0 ) && (fGroundHeight>iRepeats) )
+
         llSetPos( vTarget );
     {
+
    while( --iCounter );
         llSetPos( vNewPosition );
+
        vOldPosition = llGetPos();
+
    //llSay(0, "vOldPosition=[" + (string)vOldPosition +"]" );
+
    iRepeats++; //iRepeats is used as a safety valve to make sure that this routine doesn't repeat forever.
+
    }
+
 
}
 
}
  
Line 36: Line 31:
 
{
 
{
 
     touch_start(integer total_number)
 
     touch_start(integer total_number)
 +
    {
 
         FindGroundOrWater();
 
         FindGroundOrWater();
 +
    }
 
}
 
}
 
</pre>
 
</pre>

Revision as of 22:03, 2 September 2007

Summary

Function: float llWater( vector offset );

Returns a float that is the water height below the object position + offset

• vector offset

The requested position needs to be in the same sim.

Examples

// by Konigmann Lippmann & Strife Onizuka
FindGroundOrWater()
{
    float fHeight = llGround( ZERO_VECTOR );
    float fWaterLevel = llWater( ZERO_VECTOR );
    if( fHeight < fWaterLevel )
        fHeight = fWaterLevel;
    vector vTarget = llGetPos();

    //llSetPos can only move 10m at a time.
    integer iCounter = 1 + llAbs((integer)(vTarget.z - fHeight) / 10);
    vTarget.z = fHeight;
    do
        llSetPos( vTarget );
    while( --iCounter );
}

default
{
    touch_start(integer total_number)
    {
        FindGroundOrWater();
    }
}

See Also

Functions

•  llGround Gets the ground height
•  llWind Gets the wind velocity
•  llCloud Gets the cloud density

Deep Notes

Search JIRA for related Issues

Signature

function float llWater( vector offset );