CODE
list objects = [] ;
float GRAVITY = 9.8 ;
float force(key k)
{
float f ;
key me = llGetKey() ;
list obj_box = llGetBoundingBox(k) ;
list me_box = llGetBoundingBox(me) ;
vector obj_min = llList2Vector(obj_box, 0) ;
vector obj_max = llList2Vector(obj_box, 1) ;
vector me_min = llList2Vector(me_box, 0) ;
vector me_max = llList2Vector(me_box, 1) ;
float ratio = (me_max.z - obj_min.z)/(obj_max.z - obj_min.z) ;
if (ratio > 1) ratio = 1 ;
if (ratio > 0)
{
f = ratio * GRAVITY ;
}
else
{
f = 0.0 ;
}
return f ;
}
addKeyToList(key k)
{
integer pos = llListFindList(objects,[k]) ;
if (pos == -1)
{
objects += k ;
}
}
removeKeyFromList(key k)
{
integer pos = llListFindList(objects,[k]) ;
if (pos != -1)
{
llDeleteSubList(objects, pos, 1);
}
}
default
{
state_entry()
{
llVolumeDetect(TRUE) ;
llSetTimerEvent(0.1) ;
}
collision_start(integer num_detected) {
integer i ;
for (i = 0; i < num_detected; i++)
{
key k = llDetectedKey(i) ;
if (k != NULL_KEY)
{
addKeyToList(k) ;
}
}
}
collision_end(integer num_detected) {
integer i ;
for (i = 0; i < num_detected; i++)
{
key k = llDetectedKey(i) ;
if (k != NULL_KEY)
{
removeKeyFromList(k) ;
}
}
}
timer()
{
integer length = llGetListLength(objects);
if (length > 0)
{
llSay(0, (string)length + " objects in list") ;
integer i ;
for (i = 0; i < length; i++)
{
key k = llList2Key(objects, i) ;
float mass = llGetObjectMass(k) ;
float f = force(k) ; llSay(0, "Force is "+(string)f);
if (f > 0)
{
llPushObject(k, <0,0,1>*mass*f, <0,0,0>, FALSE) ;
}
else
{
removeKeyFromList(k) ;
}
}
}
}
}