Jump to content
Klausiii

Get UUID of Avatar selected from Dialog Menu

Recommended Posts

Hi,

i have a question and hopefully it is easy to fix.

I does have a HUD and if i clikc on it, it will scan the people witin 10m.

A Dialog menu will popup and shows me all the people.

If i click on a name i would like to send the person a message in local chat and some particles to that person.

Till now everything went well except the particles.

I am not able to get the ID of the avatar i selected from the list, i hope i just making a stupid "beginning" mistake.

Can somebody please give me tips how i can solve this.

Thanks in advance! 

// Keknehv's Particle Script v1.2
// 1.0 -- 5/30/05
// 1.1 -- 6/17/05
// 1.2 -- 9/22/05 (Forgot PSYS_SRC_MAX_AGE)

//     This script may be used in anything you choose, including and not limited to commercial products. 
//     Just copy the MakeParticles() function; it will function without any other variables in a different script
//         ( You can, of course, rename MakeParticles() to something else, such as StartFlames() )

//    This script is basically an llParticleSystem() call with comments and formatting. Change any of the values
//    that are listed second to change that portion. Also, it is equipped with a touch-activated off button,
//    for when your particles go haywire and cause everyone to start yelling at you.

//  Contact Keknehv Psaltery if you have questions or comments.

MakeParticles(key target)                //This is the function that actually starts the particle system.
{                
    llParticleSystem([                   //KPSv1.0  
        PSYS_PART_FLAGS , 0 //Comment out any of the following masks to deactivate them
    //| PSYS_PART_BOUNCE_MASK           //Bounce on object's z-axis
    //| PSYS_PART_WIND_MASK             //Particles are moved by wind
    | PSYS_PART_INTERP_COLOR_MASK       //Colors fade from start to end
    | PSYS_PART_INTERP_SCALE_MASK       //Scale fades from beginning to end
    | PSYS_PART_FOLLOW_SRC_MASK         //Particles follow the emitter
    | PSYS_PART_FOLLOW_VELOCITY_MASK    //Particles are created at the velocity of the emitter
    | PSYS_PART_TARGET_POS_MASK       //Particles follow the target
    | PSYS_PART_EMISSIVE_MASK           //Particles are self-lit (glow)
    //| PSYS_PART_TARGET_LINEAR_MASK    //Undocumented--Sends particles in straight line?
    ,
    
    PSYS_SRC_TARGET_KEY , target ,   //Key of the target for the particles to head towards
                                                //This one is particularly finicky, so be careful.
    //Choose one of these as a pattern:
    //PSYS_SRC_PATTERN_DROP                 Particles start at emitter with no velocity
    //PSYS_SRC_PATTERN_EXPLODE              Particles explode from the emitter
    //PSYS_SRC_PATTERN_ANGLE                Particles are emitted in a 2-D angle
    //PSYS_SRC_PATTERN_ANGLE_CONE           Particles are emitted in a 3-D cone
    //PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY     Particles are emitted everywhere except for a 3-D cone
    
    PSYS_SRC_PATTERN,           PSYS_SRC_PATTERN_ANGLE_CONE
    
    ,PSYS_SRC_TEXTURE,           ""                 //UUID of the desired particle texture, or inventory name
    ,PSYS_SRC_MAX_AGE,           5.0                //Time, in seconds, for particles to be emitted. 0 = forever
    ,PSYS_PART_MAX_AGE,          1.0                //Lifetime, in seconds, that a particle lasts
    ,PSYS_SRC_BURST_RATE,        0.02               //How long, in seconds, between each emission
    ,PSYS_SRC_BURST_PART_COUNT,  2                  //Number of particles per emission
    ,PSYS_SRC_BURST_RADIUS,      2.0                //Radius of emission
    ,PSYS_SRC_BURST_SPEED_MIN,   5.5                //Minimum speed of an emitted particle
    ,PSYS_SRC_BURST_SPEED_MAX,   6.0                //Maximum speed of an emitted particle
    ,PSYS_SRC_ACCEL,             <0.0,0.0,-0.8>     //Acceleration of particles each second
    ,PSYS_PART_START_COLOR,      <0.0,0.0,1.0>      //Starting RGB color
    ,PSYS_PART_END_COLOR,        <0.6,0.6,1.0>      //Ending RGB color, if INTERP_COLOR_MASK is on 
    ,PSYS_PART_START_ALPHA,      0.9                //Starting transparency, 1 is opaque, 0 is transparent.
    ,PSYS_PART_END_ALPHA,        0.0                //Ending transparency
    ,PSYS_PART_START_SCALE,      <2.4,2.4,0.0>      //Starting particle size
    ,PSYS_PART_END_SCALE,        <1.3,2.3,0.0>      //Ending particle size, if INTERP_SCALE_MASK is on
    ,PSYS_SRC_ANGLE_BEGIN,       PI                 //Inner angle for ANGLE patterns
    ,PSYS_SRC_ANGLE_END,         PI                 //Outer angle for ANGLE patterns
    ,PSYS_SRC_OMEGA,             <0.0,0.0,0.0>       //Rotation of ANGLE patterns, similar to llTargetOmega()
            ]);
}

integer dlgHandle = -1;
integer dlgChannel = -9999;
list avatarList = [];
reset()
{
    llSetTimerEvent(0.0);
    llListenRemove(dlgHandle);
    dlgHandle = -1;
}
default
{
    touch_start(integer total_number)
    {
        llOwnerSay("Scanning...");
        avatarList = [];
        // Look for any avatars within 10m.
        llSensor("", NULL_KEY, AGENT, 96.0, PI);
    }
    sensor(integer num_detected)
    {
        integer i;
        while((i < num_detected) && (i < 9))
        {
            if (llDetectedKey(i) != llGetOwner())
            {
                avatarList += [llDetectedName(i)];
            }
            ++i;
        }
        if (llGetListLength(avatarList) > 0)
        {
          state dialog;
        }
    }
}
 
state dialog
{
    state_entry()
    {
        // Set up a listener to detect button clicks.
        dlgHandle = llListen(dlgChannel, "", llGetOwner(), "");

        // Start a new timer.
        llSetTimerEvent(30.0);

        // Add a 'Cancel' button.
        avatarList += ["Cancel"];

        // Display the dialog.
        llDialog(llGetOwner(), "Please select an avatar.", avatarList, dlgChannel);
    }
    listen(integer channel, string name, key id, string message)
    {
        
        // The message parameter holds the caption of the
        // button that was clicked. Search the menu options
        // list for it.
        if ((channel == dlgChannel) && (llListFindList(avatarList, [message]) != -1))
        {
            if (message != "Cancel")
            {
                llSay(0, llKey2Name(llGetOwner()) + " pokes " + message);
               
                MakeParticles(id);
            }
            reset();
            state default;
        }
    }
    timer()
    {
        reset();
        state default;
    }
}

 

Share this post


Link to post
Share on other sites

That's because you deliberately created avatarList as a collection of names.  If you wanted UUIDs, you could have either created a parallel UUIDList to collect UUIDs in, or you could have made avatarList a strided list with alternating names and UUIDs.  Either way works.  It's just a matter of which way is more comfortable for you.

  • Thanks 1

Share this post


Link to post
Share on other sites

You may also want to replace that llKey2Name nonsense with llGetDisplayName, odd as it may seem, a lot of non-lastnamers find being constantly referred to as "[your name here] Resident" patronising, annoying and indicative of lazy scripting.
 

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

I wholeheartedly agree with Klytyna about avoiding llKey2Name , though I would beware equally in this script of using the legacy function llDetectedName().   I would grab the avatars' uuids and use llGetDisplayName(id) to populate my list of names.

Since most people's names -- legacy or display -- are going to be well over 12 or so characters long, you might want to display a list of the avatars' names in the caption to the menu, and indicate your choice by clicking a numbered button.   Rolig provides a very useful example here:  

 I really would encourage you to consider doing it that way.  

Edited by Innula Zenovka
  • Thanks 2

Share this post


Link to post
Share on other sites

Thanks a lot for the friendly and usefull replies.

I will try to change my script like the advices above. Will take some time for me to figure it out, but that is ok.

I still learning and stuff.

Thanks for helping me out!

Share this post


Link to post
Share on other sites

Hi there,

i still having trouble to populate a list with the UUID of the avatar selected from the DialogMenu.

I tried to populate them in another list but then i was not able to call them in the Listen event.

i also searched the internet, but was not able to find more information.

Is there somebody who is willing to skype with me and explain it to me what i am doing wrong?

Thanks in advance.

Share this post


Link to post
Share on other sites

For the 2 list method you define 2 lists

list namesList;
list uuidList;

In the sensor event you populate this lists

if (llDetectedKey(i) != llGetOwner())
{
	namesList += [llGetSubString(llDetectedName(i),0,23)];
	uuidList += [llDetectedKey(i)];
}
++i;

Each entry in the nameslist corresponds with the same entry # of uuidlist
In the listen event it's very easy to get the uuid now:

integer index = llListFindList(namesList,[message]);
key uuid = llList2Key(uuidList,index);
llSay(0, llGetDisplayName(llGetOwner()) + " pokes " + llGetDisplayName(uuid));

 

Share this post


Link to post
Share on other sites
6 hours ago, Klausiii said:

i still having trouble to populate a list with the UUID of the avatar selected from the DialogMenu.

I tried to populate them in another list but then i was not able to call them in the Listen event.

You need to declare the lists as global variables.   That is, you declare them before state default, like this:

list lNameslist;//by declaring the lists up here, you make it available for use throughout the script
list lKeysList;

default
{
	state_entry()
	{
		
	}
	touch_start(integer total_number)
	{
		lNameslist =[];//clear the old lists before doing anything else
		lKeysList =[];//no need to declare the list again - in fact, it breaks things if you do
		llSensor("","",AGENT,30.0,PI);
	}

	sensor(integer total_number)
	{
		//do stuff to populate lNamelist and lKeysList here
	}
}

 

Share this post


Link to post
Share on other sites

Hi there, 

now i am trying to inplement the dialogmenu as Innula told me to do.

So far it is working, only problem is that i not see the ----> button even though there are more as 14 people.

Already checked the scripted multiple times but am not able to find the error :-(

Could somebody give me tips to solve this problem please

integer listen_handle;
list namesList;
list uuidList;
integer dlgHandle = -1;
integer dlgChannel = -12345;
integer gMenuPosition;  // Index number of the first button on the current page
integer gLsn;   // Dialog Listen Handle

Menu()
{
    integer Last;
    list Buttons;
    integer All = llGetListLength(namesList);
    if(gMenuPosition >= 9)   //This is NOT the first menu page
    {
        Buttons += "    <----";
        if((All - gMenuPosition) > 11)  // This is not the last page
        {
            Buttons += "    ---->";
        }
        else    // This IS the last page
        {
            Last = TRUE;
        }            
    }    
    else if (All > gMenuPosition+9) // This IS the first page
    {
        if((All - gMenuPosition) > 11)  // There are more pages to follow
        {
            Buttons += "    ---->";
        }
        else    // This IS the last page
        {
            Last = TRUE;
        }            
    }
    else    // This is the only menu page
    {
        Last = TRUE;
    }
    if (All > 0)
    {
        integer b;
        integer len = llGetListLength(Buttons);
        // This bizarre test does the important work ......        
        for(b = gMenuPosition + len + Last - 1 ; (len < 12)&&(b < All); ++b)
        {
            Buttons = Buttons + [llList2String(namesList,b)];
            len = llGetListLength(Buttons);
        }
    }
    gLsn = llListen(-12345,"","","");    
    llSetTimerEvent(10.0);
    llDialog(llGetOwner()," \n",Buttons,-12345);
}
MakeParticles(key target)                //This is the function that actually starts the particle system.
{                
    llParticleSystem([                   //KPSv1.0  
    PSYS_PART_FLAGS , 0 //Comment out any of the following masks to deactivate them
    //| PSYS_PART_BOUNCE_MASK           //Bounce on object's z-axis
    //| PSYS_PART_WIND_MASK             //Particles are moved by wind
    //Colors fade from start to end 
    | PSYS_PART_INTERP_SCALE_MASK       //Scale fades from beginning to end
    | PSYS_PART_FOLLOW_SRC_MASK         //Particles follow the emitter
    | PSYS_PART_FOLLOW_VELOCITY_MASK    //Particles are created at the velocity of the emitter
    | PSYS_PART_TARGET_POS_MASK       //Particles follow the target
    | PSYS_PART_EMISSIVE_MASK           //Particles are self-lit (glow)
    //| PSYS_PART_TARGET_LINEAR_MASK    //Undocumented--Sends particles in straight line?
    ,
    
    PSYS_SRC_TARGET_KEY , target ,   //Key of the target for the particles to head towards
                                                //This one is particularly finicky, so be careful.
    //Choose one of these as a pattern:
    //PSYS_SRC_PATTERN_DROP                 Particles start at emitter with no velocity
    //PSYS_SRC_PATTERN_EXPLODE              Particles explode from the emitter
    //PSYS_SRC_PATTERN_ANGLE                Particles are emitted in a 2-D angle
    //PSYS_SRC_PATTERN_ANGLE_CONE           Particles are emitted in a 3-D cone
    //PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY     Particles are emitted everywhere except for a 3-D cone
    
    PSYS_SRC_PATTERN,           PSYS_SRC_PATTERN_EXPLODE
    
    ,PSYS_SRC_TEXTURE,           "722832d3-e47b-d6c6-8070-b39e8734eb54"                 //UUID of the desired particle texture, or inventory name
    ,PSYS_SRC_MAX_AGE,           10.0                //Time, in seconds, for particles to be emitted. 0 = forever
    ,PSYS_PART_MAX_AGE,          3.0                //Lifetime, in seconds, that a particle lasts
    ,PSYS_SRC_BURST_RATE,        1               //How long, in seconds, between each emission
    ,PSYS_SRC_BURST_PART_COUNT,  15                  //Number of particles per emission
    ,PSYS_SRC_BURST_RADIUS,      5.0                //Radius of emission
    ,PSYS_SRC_BURST_SPEED_MIN,   1.5                //Minimum speed of an emitted particle
    ,PSYS_SRC_BURST_SPEED_MAX,   2.0                //Maximum speed of an emitted particle
    ,PSYS_SRC_ACCEL,             <0.0,0.0,-0.8>     //Acceleration of particles each second
    ,PSYS_PART_START_ALPHA,      0.9                //Starting transparency, 1 is opaque, 0 is transparent.
    ,PSYS_PART_END_ALPHA,        0.0                //Ending transparency
    ,PSYS_PART_START_SCALE,      <0.3,0.3,0.0>      //Starting particle size
    ,PSYS_PART_END_SCALE,        <0.3,0.3,0.0>      //Ending particle size, if INTERP_SCALE_MASK is on
    ,PSYS_SRC_ANGLE_BEGIN,       PI                 //Inner angle for ANGLE patterns
    ,PSYS_SRC_ANGLE_END,         PI                 //Outer angle for ANGLE patterns
    ,PSYS_SRC_OMEGA,             <0.0,0.0,0.0>       //Rotation of ANGLE patterns, similar to llTargetOmega()
            ]);
}

reset()
{
    llSetTimerEvent(0.0);
    llListenRemove(dlgHandle);
    llListenRemove(gLsn);
    dlgHandle = -1;
}
remove_listen_handle()
{
    llListenRemove(listen_handle);
    
}
default
{
    state_entry()
    {   
        reset();
        key id = llDetectedKey(0);
        listen_handle = llListen(-5243200, "", id, "");
    }
 
    listen( integer channel, string name, key id, string message )
    {
        
        remove_listen_handle();
        namesList = [];
        uuidList = [];
        llSensor("", NULL_KEY, AGENT, 96.0, PI);
    }
   sensor(integer num_detected)
    {
        integer i;
        while((i < num_detected) && (i < 9))
        {
            if (llDetectedKey(i) != llGetOwner())
            {
                namesList += [llGetSubString(llDetectedName(i),0,23)];
                uuidList += [llDetectedKey(i)];
                
            }
            ++i;
        }
        if (llGetListLength(namesList) > 0)
        {
          state dialog;
        }
    }
}
    state dialog
{
    state_entry()
    {
        // Set up a listener to detect button clicks.
        dlgHandle = llListen(dlgChannel, "", llGetOwner(), "");

        // Start a new timer.
        llSetTimerEvent(15.0);

        // Add a 'Cancel' button.
        

        // Display the dialog.
        //llDialog(llGetOwner(), "Please select an avatar.", namesList, dlgChannel);
        llListenRemove(gLsn);
        gMenuPosition = 0;
        Menu();
    }
   
    listen(integer channel, string name, key id, string msg)
    {
        llListenRemove(gLsn);
        llSetTimerEvent(0.0);
        if (~llSubStringIndex(msg,"---->"))
        {
            gMenuPosition += 10;
            Menu();
            llOwnerSay("hello");
        }
        else if (~llSubStringIndex(msg,"<----"))
        {
            gMenuPosition -= 10;
            Menu();
            llOwnerSay("hello");
        }
        else
        {
            if ((channel == dlgChannel) && (llListFindList(namesList, [msg]) != -1))
            {
                if (msg != "Cancel")
                {
                    integer index = llListFindList(namesList,[msg]);
                    key uuid = llList2Key(uuidList,index);
                    MakeParticles(uuid);
                    llSay(0, name + " says hello to " + msg);
                    
                }
            reset();
            state default; 
            }
        }
    }
        timer()
        {
            reset();
            state default;
            
           
        }

 
    changed(integer mask)
    {   //Triggered when the object containing this script changes owner.
        if(mask & CHANGED_OWNER)
        {
            llResetScript();   // This will ensure the script listens to the new owner, and doesn't continue listening to the creator.
        }
    }
}

 

Share this post


Link to post
Share on other sites

not sure about the arrow button, i use Void's dialog code, and it works great :P

http://wiki.secondlife.com/wiki/User:Void_Singer/Functions ( at the bottom)

some other things tho?

your OP says 10 meters, but your sensor says 96,

 key id = llDetectedKey(0);  this won't work in state entry... do you need ... id = llGetOwner()_  ?

 while((i < num_detected) && (i < 9))  ..... not sure if this will only send 9 names to dialog or not?

 

Edited by Xiija

Share this post


Link to post
Share on other sites

A couple of suggestions:

1.  Xiija is quite right about the range and the limit of a sensor.  If I were writing this, I would use llGetAgentList with a timer instead of using a sensor.  Unless you are in a region with an improbably large number of avatars, llGetAgentList will get them all, but a sensor will only get the 16 closest ones.

2. Xiija is also right about warning you not to use llDetectedKey in an event that doesn't detect things.

3. Although I am mildly proud of having written the code that is 75% of your script (thank you), I think you would be better off using a menu routine that displays numbered buttons and puts the avatar names in a list.  That way, you avoid the 12 character limit on button labels and the 24 character limit on label names.  I believe Innula suggested using my numbered button script, which is a derivative of the one that Void Singer wrote and Xiija refered to.

4. Finally, I don't have time right now to look very carefully, but I suspect that you are losing something by changing states from state default to state dialog.  I suggest following key variable by inserting llOwnerSay diagnostic messages in the state_entry event of state dialog (and elsewhere) to see what's actually in some of them.

Edited by Rolig Loon

Share this post


Link to post
Share on other sites

Thanks both for the suggestions, i will try to change things and make it work. As soon i have new information or the problem have been solved i will write a message again!

Share this post


Link to post
Share on other sites

I see its been nearly a year. But I wanted to pass on how I used some of this code. I removed the particles in my own version (didnt need them). But here is how how i grabbed the UUID from a person In my buttons list. You may want to still use the numbered list, but IMO it's overly convoluted since you're the only one that will be using it. It's possible to use the display names as buttons too, by converting the detected names in your 'avatarList' to display names in the state_entry of the dialog state if you wish.

But, anyway, here is how I obtain the UUID for a selected button choice, based on your original script references.

MakeParticles(key target)                //This is the function that actually starts the particle system.
{                
    llParticleSystem([                   //KPSv1.0  
        PSYS_PART_FLAGS , 0 //Comment out any of the following masks to deactivate them
    | PSYS_PART_INTERP_COLOR_MASK       //Colors fade from start to end
    | PSYS_PART_INTERP_SCALE_MASK       //Scale fades from beginning to end
    | PSYS_PART_FOLLOW_SRC_MASK         //Particles follow the emitter
    | PSYS_PART_FOLLOW_VELOCITY_MASK    //Particles are created at the velocity of the emitter
    | PSYS_PART_TARGET_POS_MASK       //Particles follow the target
    | PSYS_PART_EMISSIVE_MASK           //Particles are self-lit (glow)
    ,
    
    PSYS_SRC_TARGET_KEY , target ,   //Key of the target for the particles to head towards
    
    PSYS_SRC_PATTERN,           PSYS_SRC_PATTERN_ANGLE_CONE
    
    ,PSYS_SRC_TEXTURE,           ""                 //UUID of the desired particle texture, or inventory name
    ,PSYS_SRC_MAX_AGE,           5.0                //Time, in seconds, for particles to be emitted. 0 = forever
    ,PSYS_PART_MAX_AGE,          1.0                //Lifetime, in seconds, that a particle lasts
    ,PSYS_SRC_BURST_RATE,        0.02               //How long, in seconds, between each emission
    ,PSYS_SRC_BURST_PART_COUNT,  2                  //Number of particles per emission
    ,PSYS_SRC_BURST_RADIUS,      2.0                //Radius of emission
    ,PSYS_SRC_BURST_SPEED_MIN,   5.5                //Minimum speed of an emitted particle
    ,PSYS_SRC_BURST_SPEED_MAX,   6.0                //Maximum speed of an emitted particle
    ,PSYS_SRC_ACCEL,             <0.0,0.0,-0.8>     //Acceleration of particles each second
    ,PSYS_PART_START_COLOR,      <0.0,0.0,1.0>      //Starting RGB color
    ,PSYS_PART_END_COLOR,        <0.6,0.6,1.0>      //Ending RGB color, if INTERP_COLOR_MASK is on 
    ,PSYS_PART_START_ALPHA,      0.9                //Starting transparency, 1 is opaque, 0 is transparent.
    ,PSYS_PART_END_ALPHA,        0.0                //Ending transparency
    ,PSYS_PART_START_SCALE,      <2.4,2.4,0.0>      //Starting particle size
    ,PSYS_PART_END_SCALE,        <1.3,2.3,0.0>      //Ending particle size, if INTERP_SCALE_MASK is on
    ,PSYS_SRC_ANGLE_BEGIN,       PI                 //Inner angle for ANGLE patterns
    ,PSYS_SRC_ANGLE_END,         PI                 //Outer angle for ANGLE patterns
    ,PSYS_SRC_OMEGA,             <0.0,0.0,0.0>       //Rotation of ANGLE patterns, similar to llTargetOmega()
            ]);
}

integer dlgHandle = -1;
integer dlgChannel;
list avatarList = [];
reset()
{
    llSetTimerEvent(0.0);
    llListenRemove(dlgHandle);
    dlgHandle = -1;
}
default
{
    state_entry()
    {
        dlgChannel = -1 - (integer)("0x" + llGetSubString( (string)llGetKey(), -7, -1) );  //set to a more personal channel
    }
    
    touch_start(integer total_number)
    {
        llOwnerSay("Scanning...");
        avatarList = [];
        llSensor("", NULL_KEY, AGENT, 10.0, PI); // Look for any avatars within 10m.
    }
    sensor(integer num_detected)
    {
        integer i;
        while((i < num_detected) && (i < 9))
        {
            if (llDetectedKey(i) != llGetOwner())
            {
                avatarList += [llDetectedName(i)];
            }
            ++i;
        }
        if (llGetListLength(avatarList) > 0)
        {
          state dialog;
        }
    }
}
 
state dialog
{
    state_entry()
    {
        dlgHandle = llListen(dlgChannel, "", llGetOwner(), ""); // Set up a listener to detect button clicks.
        llSetTimerEvent(30.0);
        avatarList += ["Cancel"];
        llDialog(llGetOwner(), "Please select an avatar.", avatarList, dlgChannel);
    }
    listen(integer channel, string name, key id, string message)
    {
        if ((channel == dlgChannel) && (llListFindList(avatarList, [message]) != -1))
        {
            if (message != "Cancel")
            {
                // We make a list and key reference to get the target key of the menu. We convert the name
                // of the target to a string using the list, then convert the string to a key. After we have
                // the key, we use that key to spew out the displayname of the button name, and pass key to 
                // the objects owner for whatever they need it for.
                
                list targetName = [];
                key targetKey;
                targetName += [message];
                string targetID = (key)llList2String(targetName,0);
                targetKey = llName2Key(targetID);

                llSay(0, llGetDisplayName(llGetOwner()) + " pokes " + llGetDisplayName(targetKey));
                llOwnerSay("Target key is " + (string)targetKey );
               
                MakeParticles(id);
            }
            reset();
            state default;
        }
    }
    timer()
    {
        reset();
        state default;
    }
}

 

Share this post


Link to post
Share on other sites

Even easier, as I suggested back in September a year ago ^^  ....  If you know from the start that you are going to want a person's UUID, you might as well just save it in a list when you do your sensor scan.  You could either save it in a separate list, so

if (llDetectedKey(i) != llGetOwner())
{
     avatarList += [llDetectedName(i)];
}

becomes

if (llDetectedKey(i) != llGetOwner())
{
   avatarList += [llDetectedName(i)];
   avatarUUIDs += [llDetectedKey(i)];
}

or you could make avatarList a strided list:

if (llDetectedKey(i) != llGetOwner())
{
     avatarList += [llDetectedName(i), llDetectedKey(i)];
}

Whichever option you choose would save you the bother of needing to reconstruct the UUID later.  

BTW, the point of using a numbered list, as Innula pointed out, is that many avatar names are too long to fit on a dialog button, so you will get an error message (or see a truncated name) when you try.

 

Share this post


Link to post
Share on other sites

No matter how you do it, you still have to extract and compare that UUID to the detectedName and do a little dance with it, even with a loop through the index locations (and that assumes the UUID and names are in the same index location in both lists).

Admittedly, a numbered list may be a more ideal way to go for some, or for a commercial product.  I personally have had no use for it.  A truncated name on a button still presents me enough information as to who I am looking for.

Edited by Jotow

Share this post


Link to post
Share on other sites
1 hour ago, Jotow said:

Admittedly, a numbered list may be a more ideal way to go for some, or for a commercial product.  I personally have had no use for it.  A truncated name on a button still presents me enough information as to who I am looking for.

Yes.  I agree that's really a side issue here.  It has nothing to do with the question you are trying to solve.  I only pointed it out because I didn't want you to have a mistaken impression about what the numbering was meant to do.

As Qie says,  the llListFindList function does an implicit "loop" to find the match between the item in one list and items in another one.  If you create two lists (names in one and UUIDs in the other one),  llListFindList tells you which list index to use in matching a specific name to a specific UUID.  If you create a single strided list, you don't even need that.

Share this post


Link to post
Share on other sites

I never gave any indicator that would imply that i misunderstood the point of the numbering. I pointed out that it wasn't a necessary component to the process if the OP was just looking to populate buttons with enough information to do the job.

But if they do want this use the numbered buttons from a list thankfully we don't 'live' in the prim age anymore. These days, we don't need a second list to match from, you only really need the one UUID list thanks to functions like llGetDisplayName. Which can be easily pulled from the list and converted using llString2Key.  ie, llGetDisplayName(llString2Key(avatarUUIDs); with that all you need to do is match the list index point of the list, with the number on the button. 

Edited by Jotow

Share this post


Link to post
Share on other sites
1 hour ago, Jotow said:

These days, we don't need a second list to match from, you only really need the one UUID list thanks to functions like llGetDisplayName. Which can be easily pulled from the list and converted using llString2Key.  ie, llGetDisplayName(llString2Key(avatarUUIDs); with that all you need to do is match the list index point of the list, with the number on the button. 

By "llString2Key" do you perhaps mean llName2Key()? ... although perhaps not, as I'm not following the intent here.

[EDIT: or maybe just good ol' llList2Key() because we're presumably extracting from a list "avatarUUIDs"]

Edited by Qie Niangao

Share this post


Link to post
Share on other sites
5 hours ago, Jotow said:

These days, we don't need a second list to match from, you only really need the one UUID list thanks to functions like llGetDisplayName. Which can be easily pulled from the list and converted using llString2Key  llName2Key.

Yup.  That's been true for a long time, so that's a good alternative to maintaining a name list, although I would probably use llList2Key, as Qie suggests.    If you actually want to display a numbered list of avatar names, you could use either approach.  Flip a coin.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...