Klausiii Posted September 20, 2017 Share Posted September 20, 2017 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; } } Link to comment Share on other sites More sharing options...
Rolig Loon Posted September 20, 2017 Share Posted September 20, 2017 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. 1 Link to comment Share on other sites More sharing options...
arton Rotaru Posted September 20, 2017 Share Posted September 20, 2017 You may also want to trim down the avatar names to no more than 24 bytes on the menu buttons, or llDialog will throw an error. 1 1 Link to comment Share on other sites More sharing options...
Klytyna Posted September 21, 2017 Share Posted September 21, 2017 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. 1 1 Link to comment Share on other sites More sharing options...
Innula Zenovka Posted September 21, 2017 Share Posted September 21, 2017 (edited) 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 September 21, 2017 by Innula Zenovka 2 Link to comment Share on other sites More sharing options...
Klausiii Posted September 21, 2017 Author Share Posted September 21, 2017 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! Link to comment Share on other sites More sharing options...
Klausiii Posted September 24, 2017 Author Share Posted September 24, 2017 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. Link to comment Share on other sites More sharing options...
Nova Convair Posted September 24, 2017 Share Posted September 24, 2017 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)); Link to comment Share on other sites More sharing options...
Klausiii Posted September 24, 2017 Author Share Posted September 24, 2017 Thats awsome, will try it right away. Thanks for the quick reply! Link to comment Share on other sites More sharing options...
Innula Zenovka Posted September 24, 2017 Share Posted September 24, 2017 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 } } Link to comment Share on other sites More sharing options...
Klausiii Posted September 24, 2017 Author Share Posted September 24, 2017 Thanks, i have done it that way and it worked like a charm. You are the best! Link to comment Share on other sites More sharing options...
Klausiii Posted September 26, 2017 Author Share Posted September 26, 2017 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. } } } Link to comment Share on other sites More sharing options...
Xiija Posted September 26, 2017 Share Posted September 26, 2017 (edited) not sure about the arrow button, i use Void's dialog code, and it works great 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 September 26, 2017 by Xiija Link to comment Share on other sites More sharing options...
Rolig Loon Posted September 26, 2017 Share Posted September 26, 2017 (edited) 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 September 27, 2017 by Rolig Loon Link to comment Share on other sites More sharing options...
Klausiii Posted September 27, 2017 Author Share Posted September 27, 2017 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! Link to comment Share on other sites More sharing options...
Jotow Posted August 28, 2018 Share Posted August 28, 2018 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; } } Link to comment Share on other sites More sharing options...
Rolig Loon Posted August 28, 2018 Share Posted August 28, 2018 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. Link to comment Share on other sites More sharing options...
Jotow Posted September 5, 2018 Share Posted September 5, 2018 (edited) 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 September 5, 2018 by Jotow Link to comment Share on other sites More sharing options...
Love Zhaoying Posted September 5, 2018 Share Posted September 5, 2018 5 minutes ago, Jotow said: and do a little dance with it. I like your technical terminology! 1 Link to comment Share on other sites More sharing options...
Qie Niangao Posted September 5, 2018 Share Posted September 5, 2018 30 minutes ago, Jotow said: even with a loop through the index locations That "loop" is what llListFindList() does for us. 1 Link to comment Share on other sites More sharing options...
Rolig Loon Posted September 5, 2018 Share Posted September 5, 2018 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. Link to comment Share on other sites More sharing options...
Jotow Posted September 11, 2018 Share Posted September 11, 2018 (edited) 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 September 11, 2018 by Jotow Link to comment Share on other sites More sharing options...
Qie Niangao Posted September 11, 2018 Share Posted September 11, 2018 (edited) 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 September 11, 2018 by Qie Niangao Link to comment Share on other sites More sharing options...
Rolig Loon Posted September 11, 2018 Share Posted September 11, 2018 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. Link to comment Share on other sites More sharing options...
Recommended Posts
Please take a moment to consider if this thread is worth bumping.
Please sign in to comment
You will be able to leave a comment after signing in
Sign In Now