Erreur de script

Répondre
Partager Rechercher
Bonjour, je voudrais creer un script qui empeche les avatars de m'approcher, je viens de le créer mais j'ai un probleme :

Citation :

integer TIME_STEPS = 5;
float SPEED_THRESHOLD = 0.5;
string SHIELD_TEXTURE = "sa";
string TRANS_TEXTURE = "sna";
string HIT_SOUND = "ArmorHit2";

integer giCurrentStep;
float gfStepSize;
integer gbFading;
key name;

default
{
state_entry()
{
llSensorRepeat("","",AGENT,4.0,PI,0.1);
name = llGetOwner();
}



sensor(integer total_number)
{
vector pos = llGetPos();
integer j;
integer count = total_number;
for (j = 0; j < count; j++)
{
if(llDetectedKey(j) != name)
{
float diff = llVecDist(pos,llDetectedPos(j));
integer dist = llRound(diff);
string result = (llDetectedName(j)) + " " + ((string)dist) + "m";


if(llDetectedName(j) == name & dist <= 4)
{
llSetStatus(STATUS_PHANTOM, TRUE);
llSetTexture( "no_active", ALL_SIDES );
llSetScale(<0.5, 0.5, 0.5>);
}
else if (llDetectedName(j) != name & dist <= 4)
{
llSetStatus(STATUS_PHANTOM, FALSE);
integer num;
integer i;
vector vVelocity;
vector vCurPos = llGetPos();

for ( i=0; i < num; i++ )
{
vVelocity = llDetectedVel(i);
if ( llVecMag(vVelocity) > SPEED_THRESHOLD )
{
llSetForce(<0,0,0>, FALSE);
llMoveToTarget(vCurPos, 0.1);
llPushObject( llDetectedKey(i), -1.5 * vVelocity, <0,0,0>, FALSE );

gbFading = FALSE;
}
}

llSetScale(<3, 3, 6>);

llSetTexture( "active", ALL_SIDES );
llSetTextureAnim( ANIM_ON | ROTATE | LOOP, ALL_SIDES, 0, 0, 0, TWO_PI, 20 );
}
else
{
llSetStatus(STATUS_PHANTOM, TRUE);
llSetScale(<0.5, 0.5, 0.5>);
llSetTexture( "no_active", ALL_SIDES ); }
llResetScript();
llSetTimerEvent(5.0);
}
}
}

no_sensor()
{
llSetStatus(STATUS_PHANTOM, TRUE);
llSetTexture( "no_active", ALL_SIDES );
llSetScale(<0.5, 0.5, 0.5>);
}

}

Quand le owner s'approche de l'objet il ne s'active pas, mais si ce n'est pas le owner, l'objet sactive. Jusque la tout va bien. Mais le problème est que : si moi je me met a coté et qu'une autre personne s'approche sa s'active mais quand la personne repart, l'objet devrait se désactiver mais il ne se désactive pas tant que je reste à coté. Je ne sais pas d'ou peut venir le problème, si quelqu'un pourrait m'aider sa serait sympas ^^. Merci d'avance
Attention dans ton script tu compares une clé ("name") a une chaine qui est vraiment un Nom ("llDetectedName(j)")


Donc aucune chance que ton script te détecte toi puisque que name sera toujours différent de ton nom...

Un conseil utilise partout des llDetectedKey(j)
merci beaucoup de ta réponse mathew, donc si je comrpend bien, la key name , il faudrai ke je fasse par exemple :

string nom = llDetectedName(name);

et comparé cette variable ?
Là ta variable name stock la clé du proprio donc toi...

or après tu compare cette clé faite de chiffre et de lettre et qui correspond a une personne unique a un Prénom Nom... Il n'y a donc aucune chance qu'il y ai un jour égalité...

Donc ce que je te conseil c'est de mettre partout llDetectedKey plutôt que llDetectedName pour les comparaison à "name" ^^
j'ai éssayé de remplacer comme tu m'as dit mais sa fait exactement pareil, le llGetOwner(); n'est pas sous forme de clée je crois ? voila le code :


Code PHP:


integer TIME_STEPS 
5;
float   SPEED_THRESHOLD 0.5;
string  SHIELD_TEXTURE "sa";
string  TRANS_TEXTURE "sna";
string  HIT_SOUND "ArmorHit2";

// Globals
integer giCurrentStep;
float   gfStepSize;
integer gbFading;
key name;

default
{
    
state_entry()
    {
    
llSensorRepeat("","",AGENT,4.0,PI,0.1);
        
name llGetOwner();
    }

    

    
sensor(integer total_number)
    {
        
vector pos llGetPos();
        
integer j;
        
integer count total_number;
        for (
0countj++)
        {
            if(
llDetectedKey(j) != name)
            {
                
float diff llVecDist(pos,llDetectedPos(j));
                
integer dist llRound(diff);
                
string result =  (llDetectedName(j)) + " " + ((string)dist) + "m";  


if(
llDetectedKey(j) == name dist <= 4)            
{
llSetStatus(STATUS_PHANTOMTRUE);
llSetTexture"no_active"ALL_SIDES );
llSetScale(<0.50.50.5>);
}
else if (
llDetectedKey(j) != name dist <= 4)
{   
llSetStatus(STATUS_PHANTOMFALSE);
integer num;
 
integer i;
        
vector vVelocity;
        
vector vCurPos llGetPos();
        
        for ( 
i=0numi++ )
        {
            
vVelocity llDetectedVel(i);
            if ( 
llVecMag(vVelocity) > SPEED_THRESHOLD )
            {
                
llSetForce(<0,0,0>, FALSE);
                
llMoveToTarget(vCurPos0.1);
                
llPushObjectllDetectedKey(i), -1.5 vVelocity, <0,0,0>, FALSE );

                
gbFading FALSE;
            }
}

llSetScale(<336>); 

llSetTexture"active"ALL_SIDES );
llSetTextureAnimANIM_ON ROTATE LOOPALL_SIDES000TWO_PI20 );      
}
else 
{
llSetStatus(STATUS_PHANTOMTRUE);
llSetScale(<0.50.50.5>);  
llSetTexture"no_active"ALL_SIDES );   }
   
llResetScript();         
 
llSetTimerEvent(5.0);               
            }
        }
    }
        
    
no_sensor()
    {
        
llSetStatus(STATUS_PHANTOMTRUE);
    
llSetTexture"no_active"ALL_SIDES );
      
llSetScale(<0.50.50.5>);
    }


Arf oui oubliai si tu veux faire des comparaisons multiples c'est pas & mais &&

&& = et
|| = ou

& = concaténation de chaine et test si vrai

donc :

if(llDetectedKey(j) == name & dist <= 4) c'est pas bon

if(llDetectedKey(j) == name && dist <= 4) là c'est bon
jai tout modifié mais sa fait toujours la meme chose, je pense que c'est un probleme des conditions non ? Le but ce sera que si une personne sapproche de moi, l'objet s'active sauf si c'est le owner. Voila le script, dsl d'insister mathew :


Code PHP:


integer TIME_STEPS 
5;
float   SPEED_THRESHOLD 0.5;
string  SHIELD_TEXTURE "sa";
string  TRANS_TEXTURE "sna";
string  HIT_SOUND "ArmorHit2";

// Globals
integer giCurrentStep;
float   gfStepSize;
integer gbFading;
key name;

default
{
    
state_entry()
    {
    
llSensorRepeat("","",AGENT,4.0,PI,0.1);
        
name llGetOwner();
    }

    

    
sensor(integer total_number)
    {
        
llSetText("Owner of shield : " + (string)name, <0.9,0.1,0.1>, 1.0);
        
vector pos llGetPos();
        
integer j;
        
integer count total_number;
        for (
0countj++)
        {
            if(
llDetectedKey(j) != name)
            {
                
float diff llVecDist(pos,llDetectedPos(j));
                
integer dist llRound(diff);
                
string result =  (llDetectedName(j)) + " " + ((string)dist) + "m";  


if(
llDetectedKey(j) == name && dist <= 4)            
{
llSetStatus(STATUS_PHANTOMTRUE);
llSetTexture"no_active"ALL_SIDES );
llSetScale(<0.50.50.5>);
}
else if (
llDetectedKey(j) != name && dist <= 4)
{   
llSetText("AGENT DETECTED : " + (string)llDetectedKey(j), <0.9,0.1,0.1>, 1.0);
llSetStatus(STATUS_PHANTOMFALSE);
integer num;
 
integer i;
        
vector vVelocity;
        
vector vCurPos llGetPos();
        
        for ( 
i=0numi++ )
        {
            
vVelocity llDetectedVel(i);
            if ( 
llVecMag(vVelocity) > SPEED_THRESHOLD )
            {
                
llSetForce(<0,0,0>, FALSE);
                
llMoveToTarget(vCurPos0.1);
                
llPushObjectllDetectedKey(i), -1.5 vVelocity, <0,0,0>, FALSE );

                
gbFading FALSE;
            }
}

llSetScale(<336>); 

llSetTexture"active"ALL_SIDES );
llSetTextureAnimANIM_ON ROTATE LOOPALL_SIDES000TWO_PI20 );      
}
else 
{
llSetStatus(STATUS_PHANTOMTRUE);
llSetScale(<0.50.50.5>);  
llSetTexture"no_active"ALL_SIDES );   }
   
llResetScript();         
 
llSetTimerEvent(5.0);               
            }
        }
    }
        
    
no_sensor()
    {
        
llSetStatus(STATUS_PHANTOMTRUE);
    
llSetTexture"no_active"ALL_SIDES );
      
llSetScale(<0.50.50.5>);
    }


y a un pb aussi sur ta conditions dans la boucle for

tu ouvres cette condition
if(llDetectedKey(j) != name)
et après tu as
if(llDetectedKey(j) == name && dist <= 4) donc cette condition n'est pas bonne... je te recontact IG ce sera plus simple


for (
j = 0; j < count; j++)
{
if(
llDetectedKey(j) != name)
{
float diff = llVecDist(pos,llDetectedPos(j));
integer dist = llRound(diff);
string result = (llDetectedName(j)) + " " + ((string)dist) + "m";


if(
llDetectedKey(j) == name && dist <= 4)
{
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés