SL - Forum scripts

Limiter un distributeur d'objets a une liste d'avatars

Répondre
Partager Rechercher
Bonjour alors comme toujours j'ai besoin d'aide pour un script pour un jeu de role.
Donc voilà le truc, j'ai un script de distributeurs d'objets qui fonctionne, mais j'aimerai limiter l'acces qu'a une liste de personne.
du genre theoaphrodite Devin est dans la liste le menu s'ouvre et peut sortir un objet
ou Loki Adderstein n'est pas dans la liste un message dans le chat local lui indique qu'il ne peut pas prendre d'objet dans la boite
Voici mon script de base
Merci d'avance pour votre aide

Code PHP:

integer nStart 0;
integer DIALOG_CHANNEL;
integer nTotalCardGiven;
dialogCard(key id)
{
    
// how many notecards ?
    
integer nCardCount llGetInventoryNumber(INVENTORY_OBJECT);
    
    
// prepare a menu with inventory notecard
    
string cTxt "";
    list 
lDlg;
    if (
nStart 0) { lDlg += "<< Prev.";} 
    else { 
lDlg += "-";}
    
lDlg += "Close";
    if (
nStart nCardCount) {lDlg += "Next >>";}
    else { 
lDlg += "-";}
    
integer nAdd 0;
    
string cItem "none";
    while (
cItem != "")
    {
        
cItem llGetInventoryName(INVENTORY_OBJECTnStart nAdd);
        if (
cItem != "")
        {
            if (
nAdd 9)
            {
                
// add to the text
                
nAdd++;
                
string cP = (string)(nAdd nStart) + ".";
                
cTxt += "\n" cP " " cItem;
                
lDlg += (string)cP;
            }
            else 
            {
                
cItem "";
            }
        }
    }
    
llDialog(idcTxtlDlgDIALOG_CHANNEL);
    
}

txtRefresh()
{
        
llSetText("" ""
                  <
101>, 1);
}

default
{
    
state_entry()
    {
        
// set text
        
txtRefresh();
        
        
// dialog menu random channel
        
DIALOG_CHANNEL llRound(llFrand(999999) + 9999);
        
llListen(DIALOG_CHANNEL""NULL_KEY"");
    }

    
touch_start(integer total_number)
    {
        
// touch key
        
key id llDetectedKey(0);
        
dialogCard(id);
        
llSay(0llDetectedName(0) + " prend");
    }
    
    
// waiting for an answer
    
listen(integer channelstring namekey idstring message)
    {
        if (
channel == DIALOG_CHANNEL)
        {
            
// prev/next/close
            
if (message == "<< Prev.")
            {
                
nStart -= 9;
                
dialogCard(id);
            }
            else if (
message == "Next >>")
            {
                
nStart += 9;
                
dialogCard(id);
            }
            else if (
message == "Close")
            {
                
// nothing to d0!
            
}
            else if ((integer)
message 0)
            {
                
// extract the notecard name
                
string cCardName llGetInventoryName(INVENTORY_OBJECT, ((integer)message) - 1);
                if (
cCardName != "")
                {
                    
llInstantMessage(id"Livraison '" cCardName "'...");
                    
llGiveInventory(idcCardName);
                    
nTotalCardGiven++;
                    
txtRefresh();
                    
nStart 0;
                }
                else
                {
                    
llInstantMessage(id".");
                }
            }
        }
    }

Dans tes variables, tu ajoutes la liste des personnes autorisées.
Attention à bien ajouter "Resident" le cas échéant.
Code PHP:

list laccess = ["theoaphrodite Devin",
                    
"Jeanpaul Resident",
                    
"Philip Linden"]; 
Tu fais un test dans l'événement touch_start, pour vérifier si le nom de la personne qui a touché fait partie de la liste ou non.
Code PHP:

     touch_start(integer total_number)
    {
    
// touch key
    
key id llDetectedKey(0);
    
string nom llDetectedName(0);
    if (
llListFindList(laccess,[nom])!=-1)
        {
        
dialogCard(id);
        
llSay(0nom " prend");
        }
    else
        
llSay(0,"Desolé, " nom ", vous n'êtes pas autorisé à ouvrir la boite");
    } 
Genial ça marche, merci beaucoup .
Y'avait une erreur un petit + oublié mais sinon tout s'adapte bien, je mets le code entier si ça peut servir a quelqu'un ^^

Code PHP:

list laccess = [ "theoaphrodite Devin",
"Jeanpaul Resident",
                    
"Philip Linden"]; 
integer nStart 0;
integer DIALOG_CHANNEL;
integer nTotalCardGiven;
dialogCard(key id)
{
    
// how many notecards ?
    
integer nCardCount llGetInventoryNumber(INVENTORY_OBJECT);
    
    
// prepare a menu with inventory notecard
    
string cTxt "";
    list 
lDlg;
    if (
nStart 0) { lDlg += "<< Prev.";} 
    else { 
lDlg += "-";}
    
lDlg += "Close";
    if (
nStart nCardCount) {lDlg += "Next >>";}
    else { 
lDlg += "-";}
    
integer nAdd 0;
    
string cItem "none";
    while (
cItem != "")
    {
        
cItem llGetInventoryName(INVENTORY_OBJECTnStart nAdd);
        if (
cItem != "")
        {
            if (
nAdd 9)
            {
                
// add to the text
                
nAdd++;
                
string cP = (string)(nAdd nStart) + ".";
                
cTxt += "\n" cP " " cItem;
                
lDlg += (string)cP;
            }
            else 
            {
                
cItem "";
            }
        }
    }
    
llDialog(idcTxtlDlgDIALOG_CHANNEL);
    
}

txtRefresh()
{
        
llSetText("" ""
                  <
101>, 1);
}

default
{
    
state_entry()
    {
        
// set text
        
txtRefresh();
        
        
// dialog menu random channel
        
DIALOG_CHANNEL llRound(llFrand(999999) + 9999);
        
llListen(DIALOG_CHANNEL""NULL_KEY"");
    }

    
touch_start(integer total_number)
    {
        
// touch key
        
key id llDetectedKey(0);
        
string nom llDetectedName(0);
        if (
llListFindList(laccess,[nom])!=-1)
        {
        
dialogCard(id);
        
llSay(0,  nom  " prend");
        }
    else
        
llSay(0,"Desolé, " +  nom ", vous n'êtes pas autorisé à ouvrir la boite");
    }  
    
    
// waiting for an answer
    
listen(integer channelstring namekey idstring message)
    {
        if (
channel == DIALOG_CHANNEL)
        {
            
// prev/next/close
            
if (message == "<< Prev.")
            {
                
nStart -= 9;
                
dialogCard(id);
            }
            else if (
message == "Next >>")
            {
                
nStart += 9;
                
dialogCard(id);
            }
            else if (
message == "Close")
            {
                
// nothing to d0!
            
}
            else if ((integer)
message 0)
            {
                
// extract the notecard name
                
string cCardName llGetInventoryName(INVENTORY_OBJECT, ((integer)message) - 1);
                if (
cCardName != "")
                {
                    
llInstantMessage(id"Livraison '" cCardName "'...");
                    
llGiveInventory(idcCardName);
                    
nTotalCardGiven++;
                    
txtRefresh();
                    
nStart 0;
                }
                else
                {
                    
llInstantMessage(id".");
                }
            }
        }
    }

Y aurait pas une écoute à fermer là quelque part

Genre quand tu clic, tu ouvres et tu lances un timer, quand y a réponse tu ferme et tu coupes le timer et si pas de réponse le timer se charge de refermer et se coupe.
Citation :
Publié par djphil
Y aurait pas une écoute à fermer là quelque part

Genre quand tu clic, tu ouvres et tu lances un timer, quand y a réponse tu ferme et tu coupes le timer et si pas de réponse le timer se charge de refermer et se coupe.
Ce n'est pas le plus gênant dans ce code, imagine des utilisateurs autorisés simultanés surtout avec la navigation dans le menu .
Bon le code est un peu confus par endroits, il faut au minimum verrouiller le menu quand quelqu'un l'utilise et utiliser un timer pour purger au cas-où :

Code PHP:

list laccess = [ "theoaphrodite Devin",
    
"Jeanpaul Resident",
    
"Philip Linden"];
integer nStart 0;
integer DIALOG_CHANNEL;
integer nTotalCardGiven;
string sBusy "";
key kAva;
float DELAI 30;
dialogCard(key id)
{
    
// how many objects ?
    
integer nCardCount llGetInventoryNumber(INVENTORY_OBJECT);

    
// prepare a menu with inventory objects
    
string cTxt "";
    list 
lDlg;
    if (
nStart 0) { lDlg += "<< Prev.";}
    else { 
lDlg += "-";}
    
lDlg += "Close";
    if (
nStart nCardCount) {lDlg += "Next >>";}
    else { 
lDlg += "-";}
    
integer nAdd 0;
    
string cItem "none";
    while (
cItem != "")
    {
        
cItem llGetInventoryName(INVENTORY_OBJECTnStart nAdd);
        if (
cItem != "")
        {
            if (
nAdd 9)
            {
                
// add to the text
                
nAdd++;
                
string cP = (string)(nAdd nStart) + ".";
                
cTxt += "\n" cP " " cItem;
                
lDlg += (string)cP;
            }
            else
            {
                
cItem "";
            }
        }
    }
    
llDialog(idcTxtlDlgDIALOG_CHANNEL);

}

txtRefresh()
{
    
llSetText("" "",
        <
101>, 1);
}

default
{
    
state_entry()
    {
        
// set text
        
txtRefresh();

        
// dialog menu random channel
        
DIALOG_CHANNEL llRound(llFrand(999999) + 9999);
        
llListen(DIALOG_CHANNEL""NULL_KEY"");
    }

    
touch_start(integer total_number)
    {
        
// touch key
        
key id llDetectedKey(0);
        
string nom llDetectedName(0);
        if (
llListFindList(laccess,[nom])!= -1)
        {
            if(
sBusy == "" || sBusy == nom)
            {
                
nStart 0;
                
kAva id;
                
sBusy nom;
                
dialogCard(id);
                
llSay(0,  nom  " prend");
                
llSetTimerEvent(DELAI);
            }
            else 
llInstantMessage(id"Le menu est actuellement utilisé par " sBusy ", veuillez essayer ultérieurement...");
        }
        else
            
llSay(0,"Desolé, " +  nom ", vous n'êtes pas autorisé à ouvrir la boite");
    }

    
timer()
    {
        
llSetTimerEvent(.0);
        
sBusy "";
        
llInstantMessage(kAva"Délai d'attente pour le menu écoulé.");
    }

    
// waiting for an answer
    
listen(integer channelstring namekey idstring message)
    {
        if (
channel == DIALOG_CHANNEL)
        {
            
// prev/next/close
            
if (message == "<< Prev.")
            {
                
nStart -= 9;
                
llSetTimerEvent(DELAI);
                
dialogCard(id);
            }
            else if (
message == "Next >>")
            {
                
nStart += 9;
                
llSetTimerEvent(DELAI);
                
dialogCard(id);
            }
            else if (
message == "Close" || message == "-")
            {
                
sBusy "";
                
llSetTimerEvent(.0);
            }
            else if ((integer)
message 0)
            {
                
// extract the object name
                
string cCardName llGetInventoryName(INVENTORY_OBJECT, ((integer)message) - 1);
                if (
cCardName != "")
                {
                    
llInstantMessage(id"Livraison '" cCardName "'...");
                    
llGiveInventory(idcCardName);
                    
nTotalCardGiven++;
                    
txtRefresh();
                    
nStart 0;
                    
sBusy "";
                    
llSetTimerEvent(.0);
                }
                else
                {
                    
llInstantMessage(id".");
                }
            }
        }
    }

Les commentaires étaient trompeurs en parlant de notecards alors qu'on récupère les nom des objets pour en faire un menu. il faut vois s'il ne reste pas quelques bugs.
Pour ceux d'un groupe
Quelle modification faut-il apporter à ce script, pour que ce soit pour ceux qui sont inscrits dans un groupe ?
J'imagine qu'il faut mettre l'URL du groupe mais avec quelle fonction ?
Merci
Hellow, ce que tu cherches se fait avec la fonction llSameGroup......il y a cependant un prob. avec cette fonction: il faut que les gens qui se compare avec le groupe soient du groupe avec lequel l' objet a été posé....or, souvent les proprios ou les buildeurs ont des groupes privés ou qui leur sont reservés pour que justement tout le monde n' y accède pas....
Salut MenthalOH et merci,

Peux-tu me dire où je dois placer la fonction llSameGroup vue sur WIKI :

Code PHP:

    touch_start(integer total_number)
    {
        
key id llDetectedKey(0);
 
        
integer sameGroup llSameGroup(id);
//      same as llDetectedGroup(i) (with llDetectedGroup, detected does not need to be in the sim)
 
        
if (sameGroup)
        {
            
integer numberOfObjectsInPrim llGetInventoryNumber(INVENTORY_OBJECT);
 
            if (
numberOfObjectsInPrim)
                
llGiveInventory(idllGetInventoryName(INVENTORY_OBJECT0));
        }
        else
        {
            
llRegionSayTo(id0"Wrong active group!");
        }
    } 
... avant :
Code:
 // dialog menu random channel

et je retire uniquement la ligne :
Code:
list laccess = [ "theoaphrodite Devin","Jeanpaul Resident","Philip Linden"];
Hello, pas eu le temps de test ingame, mais ceci devrait fonctionner....




integer nStart = 0;
integer DIALOG_CHANNEL;
integer nTotalCardGiven;
string sBusy = "";
key kAva;
float DELAI = 30;

key id;

dialogCard(key id)
{
// how many objects ?
integer nCardCount = llGetInventoryNumber(INVENTORY_OBJECT);

// prepare a menu with inventory objects
string cTxt = "";
list lDlg;
if (nStart > 0) { lDlg += "<< Prev.";}
else { lDlg += "-";}
lDlg += "Close";
if (nStart + 9 < nCardCount) {lDlg += "Next >>";}
else { lDlg += "-";}
integer nAdd = 0;
string cItem = "none";
while (cItem != "")
{
cItem = llGetInventoryName(INVENTORY_OBJECT, nStart + nAdd);
if (cItem != "")
{
if (nAdd < 9)
{
// add to the text
nAdd++;
string cP = (string)(nAdd + nStart) + ".";
cTxt += "\n" + cP + " " + cItem;
lDlg += (string)cP;
}
else
{
cItem = "";
}
}
}
llDialog(id, cTxt, lDlg, DIALOG_CHANNEL);

}

txtRefresh()
{
llSetText("" + "",
<1, 0, 1>, 1);
}

default
{
state_entry()
{
txtRefresh();

DIALOG_CHANNEL = llRound(llFrand(999999) + 9999);
llListen(DIALOG_CHANNEL, "", NULL_KEY, "");
}

touch_start(integer total_number)
{
id = llDetectedKey(0);
string nom = llKey2Name(id);

integer sameGroup = llSameGroup(id);

if (sameGroup)
{
if(sBusy == "" || sBusy == nom)
{
nStart = 0;
kAva = id;
sBusy = nom;
dialogCard(id);
llSay(0, nom + " prend");
llSetTimerEvent(DELAI);
}
else llInstantMessage(id, "Le menu est actuellement utilisé par " + sBusy + ", veuillez essayer ultérieurement...");
}
else
llSay(0,"Desolé, " + nom + ", vous n'êtes pas autorisé à ouvrir la boite");
}

timer()
{
llSetTimerEvent(.0);
sBusy = "";
llInstantMessage(kAva, "Délai d'attente pour le menu écoulé.");
}

// waiting for an answer
listen(integer channel, string name, key id, string message)
{
if (channel == DIALOG_CHANNEL)
{
// prev/next/close
if (message == "<< Prev.")
{
nStart -= 9;
llSetTimerEvent(DELAI);
dialogCard(id);
}
else if (message == "Next >>")
{
nStart += 9;
llSetTimerEvent(DELAI);
dialogCard(id);
}
else if (message == "Close" || message == "-")
{
sBusy = "";
llSetTimerEvent(.0);
}
else if ((integer)message > 0)
{
// extract the object name
string cCardName = llGetInventoryName(INVENTORY_OBJECT, ((integer)message) - 1);
if (cCardName != "")
{
llInstantMessage(id, "Livraison '" + cCardName + "'...");
llGiveInventory(id, cCardName);
nTotalCardGiven++;
txtRefresh();
nStart = 0;
sBusy = "";
llSetTimerEvent(.0);
}
else
{
llInstantMessage(id, ".");
}
}
}
}
}
Merci
Une question de novice, je ne vois pas comment introduire un objet (une arme) dans la prim (le cube) qui me sert de distributeur.
Le script est rezzer dans la prim, mais aucun objet n'y rentre !
Peux-tu m'éclairer ?
Une prim que j'ai créé, et elle est modifiable.
J'ai essayé de mettre une shoe dans mon cube, sans succès !
Ce distributeur ne copie pas les objets directement à partir de mon inventaire ... je pense qu'il faut mettre une copie dans la prim qui va me servir de distributeur !
Faut-il que je fasse un script que j'insère dans l'objet, pour qu'il soit accepté par ma prim ?
Ou il y a t-il une ligne à changer dans le script de bestmomo, concernant l'objet à distribuer ?

EDIT :
Je viens de trouver comment faire !
Je n'ai pas pensé à ouvrir ma prim et à inserer l'objet dedans (dans la fenêtre), ce qui fonctionne de cette façon. Car je m'étais contenté de glisser l'objet directement vers la prim, ce qui fait qu'elle restait en surface !
J'ai moins d'un an sur SL, et je n'ai pas fini d'apprendre, c'est un monde de création passionnant !

Dernières questions :
Combien d'objet je peux mettre dans ce distributeur ?
Je ne vois pas la ligne où est inscrite cette variable, mais le chiffre 9 apparait plus d'une fois, est-ce là ?
Si oui, dois-je changer tous les 9 par le nombre que je veux ?


Encore merci MenthalOH

Dernière modification par MateA ; 15/05/2020 à 13h56.
non, le chiffre 9 permet juste d' ajouter des pages de menus supplémentaires (s'il y a plus de 9 objets, le script prépare une autre page de menu)....le script compte tout seul le nombre d' objets dans la prim et organise automatiquement le menu, le nombre d' objets n' est pas limité....

Dernière modification par MenthalOH ; 15/05/2020 à 15h08.
Répondre

Connectés sur ce fil

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