[SCRIPT] Destruction de Script

Répondre
Partager Rechercher
Bonsoir a tous.

Je me pose une question.
Si un Script est présent dans une boite qui est en vente (type vendre le contenu) , est-il possible de faire une auto-destruction de celui si ?

Si on vend une copie de la boite ça pose aucun problème avec un on_rez , ok.

Autre souci je dois pouvoir donner le script à d'autres personnes avant utilisation.

Expliquation du projet: Une Loterie

Un Script type envois d'informations diverses est placé dans chaque Cubes a vendre sur une Sim. Certain sont à vendre en copie et d'autre en contenu.

Le Client ne dois pas pouvoir réutiliser le script ultérieurement.
Tout d'abord, le script doit être no modif.

Crée une variable comptabilisant le nombre de changement de propriétaire que tu autorises.
Ensuite, ajoutes-y un event changed sur le changement de proprio :
Code:
integer NbOwner = 2;

default
{
    changed( integer change )
    {
        if( change & CHANGED_OWNER )
        {
            if( ! (--NbOwner) )
                llDie();
        }
    }
}
C'est malheureusement impossible. Malgré ça, il y a une autre possibilité, c'est que ton script envoie tout le contenu de l'inventaire de l'objet, sauf lui-même. J'avais rien à faire donc j'en ai profité pour faire une petite fonction :

Code PHP:


SendInventoryContent
key target, list exceptionsstring folder )
{
    list 
pack;
    
string curInvName;
    
integer curInvNum llGetInventoryNumberINVENTORY_ALL );
    
    while( ~ --
curInvNum )
    {
        
curInvName llGetInventoryNameINVENTORY_ALLcurInvNum );
        if( ! ~
llListFindList(exceptions, [curInvName]) )
            
pack += curInvName;   
    }  
     
     
    if( 
pack != [] )
        
llGiveInventoryListtargetfolderpack );
    
}




default
{

    
touch_start(integer total_number)
    {
        
// on envoie tout le contenu de l'inventaire sauf le script lui-même
        // dans un dossier portant le même nom que l'objet
        
SendInventoryContentllDetectedKey(0), [llGetScriptName()], llGetObjectName() );
    }

Elle permet d'envoyer le contenu entier de l'inventaire d'un objet sauf des exceptions (comme des scripts).

Edit : il faut désactiver la fonction de mise en vente de l'objet
oui , j'avais fait des tests avec l'événement changed , ça fonctionne pas , il détecte pas le changement de propriétaire en cas de vente de contenu mais seulement en cas de vente de l'objet
Code:
 
key owner;
default
{
    state_entry()
    {
        owner = llGetOwner();
    }
    on_rez(integer t)
    {
      if(llGetOwner() != owner)
      {
          llRemoveInventory(llGetScriptName());
      }
    }
}
ça efface le script quand quelqu'un d'autre que celui qui a enregistré le script, rez.
soit tu l'incorpore dans ton script, soit tu remplace llGetScriptName() par le nom du script à effacer genre
llRemoveInventory(llGetScriptName());
llRemoveInventory("New Script");
Citation :
Publié par kya22
ça efface le script quand quelqu'un d'autre que celui qui a enregistré le script, rez.
soit tu l'incorpore dans ton script, soit tu remplace llGetScriptName() par le nom du script à effacer genre
llRemoveInventory(llGetScriptName());
llRemoveInventory("New Script");
Ca ne marchera pas en cas de vente type contenu.

Autre solution (qui est déjà la deuxième donnée), créer une constante avec ta key dedans et vérifier si le script est bien utilisé par toi :

Code PHP:


key OWNER 
"a822ff2b-ff02-461d-b45d-dcd10a2de0c2"// ta key ici

integer IsOwnerkey newOwner )
{
    return (
newOwner == OWNER);
}


default
{
     
    
on_rezinteger p )
    {
          if( !
IsOwner(llGetOwner()) )
              
llRemoveInventoryllGetScriptName() );
    }
     
    
state_entry()
    {
          if( !
IsOwner(llGetOwner()) )
              
llRemoveInventoryllGetScriptName() );
    }


Je trouve cette méthode pas propre du tout et pas pratique surtout si il peut être utilisé par plusieurs personnes ça devient un vrai bordel.
Citation :
Publié par BlackShade Nightfire
Autre solution (qui est déjà la deuxième donnée), créer une constante avec ta key dedans et vérifier si le script est bien utilisé par toi :

Code PHP:

 
key OWNER 
"a822ff2b-ff02-461d-b45d-dcd10a2de0c2"// ta key ici
 
integer IsOwnerkey newOwner )
{
    return (
newOwner == OWNER);
}
 
 
default
{
 
    
on_rezinteger p )
    {
          if( !
IsOwner(llGetOwner()) )
              
llRemoveInventoryllGetScriptName() );
    }
 
    
state_entry()
    {
          if( !
IsOwner(llGetOwner()) )
              
llRemoveInventoryllGetScriptName() );
    }


Je trouve cette méthode pas propre du tout et pas pratique surtout si il peut être utilisé par plusieurs personnes ça devient un vrai bordel.

Ta solution me semble pas mal , si je lui mets la liste des personnes (key) qui vont vendre des contenus.

Code PHP:

 
list lKeyAv = [...];
 
default
{
 
    
on_rezinteger p )
    {
          if( !~
llListFindList(lKeyAv,[llGetOwner()] )
              
llRemoveInventoryllGetScriptName() );
    }
 
    
state_entry()
    {
          if( !~
llListFindList(lKeyAv,[llGetOwner()] )
              
llRemoveInventoryllGetScriptName() );
    }

En tous cas Merci beaucoup pour vos conseils
Citation :
Publié par BlackShade Nightfire
Ca ne marchera pas en cas de vente type contenu.

Autre solution (qui est déjà la deuxième donnée), créer une constante avec ta key dedans et vérifier si le script est bien utilisé par toi :

Code PHP:

 
key OWNER 
"a822ff2b-ff02-461d-b45d-dcd10a2de0c2"// ta key ici
 
integer IsOwnerkey newOwner )
{
    return (
newOwner == OWNER);
}
 
 
default
{
 
    
on_rezinteger p )
    {
          if( !
IsOwner(llGetOwner()) )
              
llRemoveInventoryllGetScriptName() );
    }
 
    
state_entry()
    {
          if( !
IsOwner(llGetOwner()) )
              
llRemoveInventoryllGetScriptName() );
    }

euh mais quelle est la difference avec mon script ? à part que la clé est à rentrer manuellement, ce que j'ai voulu éviter.

c'est vrais que ca marche pas en vente de contenu vu que ca passe pas par le rez, ni par le state entry en fait ca part direct dans l'inventaire donc faut pas l'envoyer dutout. Sinon si le ce contenu est une boite à rezzer dans laquelle il a le contenu et le script indésirable la oui vu qu'il y a une execution avec le on_rez, à partir du moment ou le script reste dans l'objet, la clé est gardée en memoire depuis que le script a été copié ou sauvegardé, dans l'autre cas, en contenu, rien ne peut se passer dans le script, la y a rien à faire sauf de ne pas l'envoyer.
Citation :
Publié par kya22
euh mais quelle est la difference avec mon script ? à part que la clé est à rentrer manuellement, ce que j'ai voulu éviter.

c'est vrais que ca marche pas en vente de contenu vu que ca passe pas par le rez, ni par le state entry en fait ca part direct dans l'inventaire donc faut pas l'envoyer dutout. Sinon si le ce contenu est une boite à rezzer dans laquelle il a le contenu et le script indésirable la oui vu qu'il y a une execution avec le on_rez, à partir du moment ou le script reste dans l'objet, la clé est gardée en memoire depuis que le script a été copié ou sauvegardé, dans l'autre cas, en contenu, rien ne peut se passer dans le script, la y a rien à faire sauf de ne pas l'envoyer.
C'est bien pour ça que j'ai précisé au début dans mon premier post que c'était impossible (l'auto-destruction dans l'inventaire) et que j'ai donné une fonction pour ne pas envoyer le script lui-même.

La deuxième solution part du principe que le script ne peut être utilisé que par une ou plusieurs personnes autorisée(s).

Les situations :

- J'obtient le contenu de la boite et je place le script dans un autre objet
- J'obtient la boite je la rez de mon inventaire
- J'obtient la boite je la rez dans une zone no script, je copie le contenu dans mon inventaire et je place le script dans un autre objet

Ta méthode ne fonctionne que sur une des 3 (la deuxième).
Répondre

Connectés sur ce fil

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