05 mayo, 2011

Funciones útiles lsl

1- comparar listas, devolver las coincidencias
// devuelve una lista que contiene solo los objetos contenidos en las dos listas de entrada a la vez
list listmatch( list inputs,list keys ){
list rete=[];
integer point=0;
integer max=llGetListLength( input ) - 1;
while( max >= point ) {
if(llListFindList(keys,llList2String(inputs,point)) != -1){
rete+=llList2String(inputs,point);
}
point+=1;
}
return rete;
}

2- detectar posición desde uuid (sin sensor)
// fuck the sensor hack por abderramah
// 
// detectar posición del agente a través de llGetObjectDetails
// no depende de ningún evento y devuelve la constante ZERO_VECTOR 
// si no detecta nada. (es muy util combinarlo con "distancia entre vectores.txt")

vector scal_getpos(key jedy_obje_t){if (jedy_obje_t){list tmp_vector_lis=llGetObjectDetails(jedy_obje_t, [OBJECT_POS]);
if (tmp_vector_lis!= []){ vector safe_detectedpos= llList2Vector(tmp_vector_lis, 0);return safe_detectedpos;}}return ZERO_VECTOR;
}

3- calcular la distancia entre dos vectores
// por abderramah
// devuelve la distancia entre dos vectores (dme y dhim) en unidades espaciales

float scal_getdist(vector dme, vector dhim){
vector dist=dme-dhim;
float zA;float yA;float xA;float retA;
xA=dist.x;zA=dist.z;yA=dist.y;
if (xA<0){xA=dist.x*-1;} if (yA<0){yA=dist.y*-1;} if (zA<0){zA=dist.z*-1;}
retA=xA+yA+zA;return retA;
}

4- constructor de slurl
// SLURL Maker 0.4 by Dyne Talamasca
// crea un vínculo slurl de la posición actual del prim

slurlmaker(){
vector Where;
string Name;
string SLURL;
vector V;
Name = llGetRegionName();
Where = llGetPos();
V.x = (integer)Where.x;
V.y = (integer)Where.y;
V.z = (integer)Where.z;
// I don't replace any spaces in Name with %20 and so forth.
SLURL = "http://slurl.com/secondlife/" + Name + "/" + (string)V.x + "/" + (string)V.y + "/" + (string)V.z + "/?title=" + Name;
return SLURL;
}

5- tirada de dados
// emula una tirada de dados del número de caras definido en parámetro
// si el número es menor de 1 tira uno de dos caras
integer d(integer caras){
 if(caras>=1){
  return llRound(llFrand(caras - 1)+1);
 }else{
  return llRound(llFrand(2 - 1)+1);
 }
}

Publicar un comentario en la entrada