Jump to content

Sylvia Wasp

Resident
  • Content Count

    187
  • Joined

  • Last visited

Everything posted by Sylvia Wasp

  1. Yes, except for the fact that most people don't actually use their legacy names (sadly). The idea behind this scanner is that if you're in a room full of avatars and looking at the labels above their heads, what the scanner should return is what those labels say, so that the user can correlate the label on the button with the persons they see in front of them.
  2. thanks for this detail Wulfie. 🙂 Overall, though I don't see this as a problem, especially when the alternative is severely truncated names. The scanner is mostly for use at dances, shopping malls, etc. and let's face it, most avatars won't be using characters that cause any problems. The majority of avatars just use regular names in the language symbols of their home country in standard fonts available on most modern computers. Only a small sub-set of avatars will use "weird/interesting" characters from other languages and font sets (for the "cool" factor 🙂 ), and an even smaller subset of those will use characters that might cause a problem with the scanner. In testing, it seems that llBase64ToString deals with those rare cases very well. All the names I've seen on the buttons are clear and easily recognisable as the folks standing around me when I'm scanning.
  3. thanks Chic, I was worried that was the answer, but thanks anyway Seems to happen way more often with TGA's too for what it's worth.
  4. I've seen this happen on and off over the years and never heard of a good explanation, so here goes ... Basically, pictures (textures) that I've uploaded into inventory, (especially those I use in my profile), just randomly sometimes show up as blurred. They never resolve into an image. I've tried rebooting, changing graphics settings and all the typical things, but it isn't that. I have a good computer, I run on mostly Max settings etc. It's as if the server is just storing a low-res version and has dispensed with the actual file. This is NOT a transient problem. Once a texture gets blurred out, there seems no fixing for it. It never "comes back." I can download this textures out of SL and they show up as blurred on my desktop. It seems SL is just randomly scr*wing up my textures and no one seems to know why or how or what to do about it.
  5. Thanks KT. This is what I suspected (if I understand what you're saying here). That it might be possible to screen out the errant characters before they cause problems and hopefully, (again if I understand what you're saying), without having to cut the names down to un-recogniseable stubs of only 6 characters in length. The whole deal in what I'm trying to achieve is a bank of buttons with avatars names on them. If they aren't identifiable as the avatars standing around the user, then there isn't much point.
  6. Cool. Thanks a lot Molly. This is exactly what I need.
  7. Okay, so I wrote this script (with help from this very forum!) that lists out all the avatars in a sim and puts their names on a button dialogue. That may not seem useful but it's just a part of a bigger project. There are two problems with the script (if anyone wants to help out). 1) I clearly don't know what I'm doing with the listens, lol. every time I try to fix them so they are both created and deleted properly, I get "doubles" on the buttons, (every avatar name appears twice) so I've had to comment out most of it which is kind of bad practice (listens must be dealt with). 2) If there is some douchebag avatar in the sim with some fancy ass name with symbols and stuff in it, I get a script error something like, "buttons should only have so many characters dumbass," even though I've got code in here to stop that exact thing (see below). for (i = 0; i < number_of_keys; ++i) { thisKey = llList2Key(keys,i); if (thisKey != llGetOwner()) { detected_list += [ llRound(llVecDist(currentPos, llList2Vector(llGetObjectDetails(thisKey,[OBJECT_POS]),0))), llGetSubString(llGetDisplayName(thisKey), 0, 11), thisKey ]; } Only the names with the weird symbols in them sets off the error, so I'm thinking that somehow the Trademark symbol or the Copyright symbol or whatever stupid emoji it is, is functioning like an escape character or something? It rarely happens, and it only happens when some 8 foot tall toxic male with a ridiculous long name is in the sim, so it's probably just a single individual character that's doing it. Maybe it's being done on purpose? In any case, if anyone know if there is a way to limit the Unicode set, or identify the errant character and then check for it, or take it out before this happens I'd appreciate it. the entire script (so far) follows: integer cmdChannel; integer gMenuPos; integer gListen; list detected_list; list avatar_list; integer Key2Chan(key ID) { return 0x80000000 | (integer)("0x"+(string)ID); } multipage_dialogue() // replaces regular dialogue, deals with more pages { integer lastPage; list buttons; integer listLength = llGetListLength(avatar_list); if(gMenuPos >= 9) { buttons += " <----"; if((listLength - gMenuPos) > 11) { buttons += " ---->"; } else { lastPage = TRUE; } } else if (listLength > gMenuPos+9) { if((listLength - gMenuPos) > 11) { buttons += " ---->"; } else { lastPage = TRUE; } } else { lastPage = TRUE; } if (listLength > 0) { integer b_count; integer num_of_buttons = llGetListLength(buttons); for(b_count = gMenuPos + num_of_buttons + lastPage - 1 ; (num_of_buttons < 12) && (b_count < listLength); ++b_count) { buttons = buttons + [llList2String(avatar_list,b_count)]; num_of_buttons = llGetListLength(buttons); } } // gListen = llListen(cmdChannel,"","",""); llSetTimerEvent(10.0); llDialog(llGetOwner()," \n",buttons,cmdChannel); } default { state_entry() { cmdChannel = Key2Chan(llGetOwner()); llListen(cmdChannel, "", llGetOwner(), ""); } touch_start(integer total_number) { llListenRemove(gListen); llSetTimerEvent(0.0); gMenuPos = 0; avatar_list = ["SCAN", "Reset", "Done"]; detected_list = []; multipage_dialogue(); } listen( integer channel, string name, key id, string message ) { if( message == "SCAN" ){ avatar_list = []; llOwnerSay( "scanning for avatars within 96m ..." ); key thisKey; vector currentPos = llGetPos(); list keys = llGetAgentList(AGENT_LIST_REGION, []); integer number_of_keys = llGetListLength(keys); integer i; for (i = 0; i < number_of_keys; ++i) { thisKey = llList2Key(keys,i); if (thisKey != llGetOwner()) { detected_list += [ llRound(llVecDist(currentPos, llList2Vector(llGetObjectDetails(thisKey,[OBJECT_POS]),0))), llGetSubString(llGetDisplayName(thisKey), 0, 11), thisKey ]; } } detected_list = llListSort(detected_list, 3, FALSE); avatar_list = llList2ListStrided(llDeleteSubList(detected_list, 0, 0), 0, -1, 3); if (llGetListLength(avatar_list) < 1) { llSleep(1.0); llOwnerSay( "Sorry ... no other avatars found in this simulator"); return; } else multipage_dialogue(); } else if ( message == "Reset") { llResetScript(); } else if ( message == "Done") { // llListenRemove(gListen); } else if (~llSubStringIndex(message,"---->")) { gMenuPos += 10; multipage_dialogue(); } else if (~llSubStringIndex(message,"<----")) { gMenuPos -= 10; multipage_dialogue (); } else { llOwnerSay(message); // the (named) button you pressed llOwnerSay((string) llList2String(detected_list, (llListFindList(detected_list,[message]) + 1))); // that avatar's key multipage_dialogue (); } } timer() { llSetTimerEvent(0.0); // llListenRemove(gListen); } } thanks, Sylvia Wasp
  8. Well, the "SCAN" button is always presented in the first dialogue box from the touch event, but previously the structure has been that the avatar list is appended to that, so that even when the buttons are populated with names, one of them is always "SCAN." This gives the user the option of (re)SCAN-ing to refresh the list. While this was easy at first, now that I'm using strided lists and a bunch of (to me) super-complicated and counter-intuitive functions to grab/slice/sort various parts of said strided list, the addition of non-strided data just made things super confusing so I left it out of this version. In this version, after the initial SCAN button is presented and clicked, it's replaced by the avatar name buttons. I would like to include it again, and possibly a "Done" and a "Reset" mostly for the same reasons you mention yourself about user interactions. I'll probably figure out a way to do it eventually. I think I need to read up on ordering/formatting the button layout but that's also super-confusing too, so I guess I've been avoiding dealing with it. This is funny because the very last thing I did before I posted this code was to remove a detected_list = [ ]; from the code at the top of the SCAN section of the listen because it was stopping the whole script from working. It made detected_list unavailable to the last part of the listen where I use it to get the avatar key, which is the whole point of the script. The avatar_list = ["SCAN"]; in the touch event functions (sort of) as a clearing of that list in that it replaces whatever might have been in there before. Should I also have detected_list = [ ]; there for the same reason? As I said, if I put it in the listen, where avatar_list = [ ]; is, it breaks the whole script. And since both lists are declared at the top ... why should I need to put it in the touch event anyway? Is putting avatar_list = ["SCAN"]; and detected_list = [ ]; at the top with the other variables the same thing as putting it in the touch event? Do I have to do both? Is one better than the other? In short, I'm still confused as to where exactly to put things, or whether I've put them in the right place, since LSL doesn't seem to check for duplicate variable names or anything to do with context. I call detected_list at the top, but if I call it again within a loop of a listen, then it's treated like a completely different, second list but with the same name?? WTF? And the compiler produces no errors to inform you of your mistake?? Insanity! (lol) Where to call things, and which parts of the script those things will ultimately be available too, or "seen by," has to be the most confusing and screwed up part of the whole LSL scripting language. I'm not super experienced as I noted, but it seems highly irregular to me relative to other scripting languages I've used. I don't really expect you to answer these questions. I'm just trying to convey how confusing and nonsensical all this is to the novice scripter. ok </rant> over, lol Sylvia
  9. Okay, I honestly thought this thread was over, lol ... but I can't seem to put this thing down. So, I quickly rewrote the script using llGetAgentList and it works but I'd like some feedback because my solution feels a bit "messy" to me. I have some stuff in the touch event that may not really belong there? May not be necessary even? I didn't end up restricting it by distance as during my testing it was fast and smooth and the number of avatars doesn't seem to affect things at all (I imagine this is because it's a single call to the server for a list instead of a cumbersome scan/calculation?) not sure. What it's missing is: - a "re-scan" button (every time I add extra buttons beyond the avatar list into the mix, things seem to screw up) - a timer to disappear the dialogue box if nothing it touched for a while (or a reset button?) Anyway, here it is. Detects all avatars in a sim, creates a strided list (distance, display name, key) and sorts by distance. Presents the user with a multi-page dialogue filled with buttons with the avatars names on them. Pressing one of the named buttons gives you the name and key of that avatar (so you can do stuff). I also (I think) added in the handler for "no avatars found" (re: Qie's comment on the earlier script). It all seems to work, but please ... tell me what's wrong with it. // ====== Sylvia's Avatar Detect v3 ====== integer cmdChannel; integer gMenuPos; integer gListen; list detected_list; list avatar_list; integer Key2Chan(key ID) { return 0x80000000 | (integer)("0x"+(string)ID); } multipage_dialogue() { integer lastPage; list buttons; integer listLength = llGetListLength(avatar_list); if(gMenuPos >= 9) { buttons += " <----"; if((listLength - gMenuPos) > 11) { buttons += " ---->"; } else { lastPage = TRUE; } } else if (listLength > gMenuPos+9) { if((listLength - gMenuPos) > 11) { buttons += " ---->"; } else { lastPage = TRUE; } } else { lastPage = TRUE; } if (listLength > 0) { integer b_count; integer num_of_buttons = llGetListLength(buttons); for(b_count = gMenuPos + num_of_buttons + lastPage - 1 ; (num_of_buttons < 12) && (b_count < listLength); ++b_count) { buttons = buttons + [llList2String(avatar_list,b_count)]; num_of_buttons = llGetListLength(buttons); } } gListen = llListen(cmdChannel,"","",""); llSetTimerEvent(10.0); llDialog(llGetOwner()," \n",buttons,cmdChannel); } default { state_entry() { cmdChannel = Key2Chan(llGetOwner()); llListen(cmdChannel, "", llGetOwner(), ""); } touch_start(integer total_number) { llListenRemove(gListen); llSetTimerEvent(0.0); gMenuPos = 0; avatar_list = ["SCAN"]; multipage_dialogue(); } listen( integer channel, string name, key id, string message ) { if( message == "SCAN" ){ avatar_list = []; llOwnerSay( "scanning for avatars within 96m ..." ); key thisKey; vector currentPos = llGetPos(); list keys = llGetAgentList(AGENT_LIST_REGION, []); integer number_of_keys = llGetListLength(keys); integer i; for (i = 0; i < number_of_keys; ++i) { thisKey = llList2Key(keys,i); if (thisKey != llGetOwner()) { detected_list += [ llRound(llVecDist(currentPos, llList2Vector(llGetObjectDetails(thisKey,[OBJECT_POS]),0))), llGetSubString(llGetDisplayName(thisKey), 0, 11), thisKey ]; } } detected_list = llListSort(detected_list, 3, FALSE); avatar_list = llList2ListStrided(llDeleteSubList(detected_list, 0, 0), 0, -1, 3); if (llGetListLength(avatar_list) < 1) { return; // probably needs to give a message about "no avatars found" here } else multipage_dialogue(); } else if (~llSubStringIndex(message,"---->")) { gMenuPos += 10; multipage_dialogue(); } else if (~llSubStringIndex(message,"<----")) { gMenuPos -= 10; multipage_dialogue (); } else { llOwnerSay(message); // the (named) button you pressed llOwnerSay((string) llList2String(detected_list, (llListFindList(detected_list,[message]) + 1))); // the key! multipage_dialogue (); } } timer() { llSetTimerEvent(0.0); llListenRemove(gListen); } }
  10. A lot of the earlier work (even though I don't understand it) seemed much more creative to me. I was once given a machine by Xylor Baysklef, made out of prims itself, that used scripts to rez rods and balls and panels that then self assembled into giant geodesic spheres in the air. It was a beautiful, elegant and intuitive design and a wonder just to watch it do it's work. It was made long before mesh and most of the scripting possibilities that exist today.
  11. Cool. I wish there were another way around the 16 avatar limit than getting a list of every avatar in a sim though which may be very long and unwieldy for my purposes, but it’s something I’ll have to try. The original idea was for a HUD that would be used in a busy store or a dance floor situation. Basically scanning the avatars around you, that you can see. Collecting the whole sim means collecting avatars in other contexts doing other things that the user can neither see nor in many cases is even aware of, which may be confusing for them besides being a possible invasion of privacy. Only collecting 16 avatars seems far too few and trying to collect the whole sim seems like overkill. 30 or so would be perfect, but if those are the only choices then I will have to pick one or the other. Perhaps I can collect the whole sim, then sort by distance and mask out those avatars clearly out of range of the present location/context of the user. It will be interesting to try. I might also try the numbered buttons thing after all as it (foolishly) didn’t occur to to me that there would be a text based ‘key’ to the numbered buttons as you describe above. My frustration with numbered buttons was more because blank numbered buttons don’t convey anything to the user, as in my example of a piece of furniture that just presents the user with buttons labelled 1-12 for poses. Thanks again for all the help. Sylvia
  12. Very interesting. A part of the reason I hate code is that I find it difficult to get that clear conception in my head. When I'm painting a picture, or making something out of prims, or using a design/paint program I *begin* with a definite, clear, "vision" if you will of exactly what it looks like when it's finished then I just keep working until the reality matches the vision. With code on the other hand I usually feel like I'm crawling across a bumpy floor in complete darkness looking for "stuff" and only about half-way through (if I'm lucky) do I get a clear vision of what it is I should be doing or working towards. In any case, due to the help that I've received here, I've managed to correct all the stupid errors (I think) and had a long talk with Grandmother about what it is I'm doing. She said ... that what I want in the end is avatar keys, and what I want for the dialogue box is avatar names and I want them associated together. So what I really want is a database. The closest thing to a database in SL is the strided list, so I spent a day reading up on strided lists and re-wrote the thing from that perspective and with (most) stupid errors removed. It's not that different but at least it finally works OK and could be said to be "finished" in terms of my original question at the top of the thread. It scans the area for avatars, produces a nice button list of their names, and clicking on a button gives you their name and their key so you can "do stuff" with it. There are some things I'd like to make it work better though. 1) I had no idea that sensor was limited to 16 avatars! Is there any way around that at all? 2) It sometimes errors out saying that I have a button with more than 24 characters (when obviously I don't). So far this has only happened in a Linden Hub where the crowd is mostly griefers, racists, paedophiles, & Trump supporters, so I'm thinking it's either LAG or shenanigans of some kind. 2b) if it's LAG, is there any way to assure that bits of the script don't execute in the wrong order or that every part of it waits properly before continuing in a high lag environment? 2c) if it's shenanigans, that suggests that a player can "do something" to their display name to screw up my code. Is that really possible? Edit: Just realised that the avatar_list = ["SCAN"]; at the beginning of the sensor is probably unnecessary or should be blank. // ====== Sylvia's Avatar Detect v2 ====== integer cmdChannel; integer gMenuPos; integer gListen; float sensor_range = 96.0; list detected_list; list avatar_list; integer Key2Chan(key ID) { return 0x80000000 | (integer)("0x"+(string)ID); } multipage_dialogue() { integer lastPage; list buttons; integer listLength = llGetListLength(avatar_list); if(gMenuPos >= 9) { buttons += " <----"; if((listLength - gMenuPos) > 11) { buttons += " ---->"; } else { lastPage = TRUE; } } else if (listLength > gMenuPos+9) { if((listLength - gMenuPos) > 11) { buttons += " ---->"; } else { lastPage = TRUE; } } else { lastPage = TRUE; } if (listLength > 0) { integer b_count; integer num_of_buttons = llGetListLength(buttons); for(b_count = gMenuPos + num_of_buttons + lastPage - 1 ; (num_of_buttons < 12) && (b_count < listLength); ++b_count) { buttons = buttons + [llList2String(avatar_list,b_count)]; num_of_buttons = llGetListLength(buttons); } } gListen = llListen(cmdChannel,"","",""); llSetTimerEvent(10.0); llDialog(llGetOwner()," \n",buttons,cmdChannel); } default { state_entry() { cmdChannel = Key2Chan(llGetOwner()); llListen(cmdChannel, "", llGetOwner(), ""); } touch_start(integer total_number) { avatar_list = ["SCAN"]; multipage_dialogue(); llListenRemove(gListen); gMenuPos = 0; } sensor( integer number_detected ) { avatar_list = ["SCAN"]; detected_list = []; integer i; for( i = 0; i < number_detected; i++ ){ if( llDetectedKey( i ) != llGetOwner() ){ string detected_name = llGetSubString(llGetDisplayName(llDetectedKey( i )), 0, 11); key detected_key = llDetectedKey( i); detected_list += detected_name; detected_list += detected_key; } } avatar_list = llList2ListStrided(detected_list, 0, -1, 2); multipage_dialogue(); } listen( integer channel, string name, key id, string message ) { llListenRemove(gListen); llSetTimerEvent(0.0); if( message == "SCAN" ){ llOwnerSay( "scanning for avatars within 96m ..." ); llSensor("", NULL_KEY, AGENT, sensor_range, PI); } else if (~llSubStringIndex(message,"---->")) { gMenuPos += 10; multipage_dialogue(); } else if (~llSubStringIndex(message,"<----")) { gMenuPos -= 10; multipage_dialogue (); } else { llOwnerSay(message); llOwnerSay((string) llList2String(detected_list, (llListFindList(detected_list,[message]) + 1))); multipage_dialogue (); } } timer() { llSetTimerEvent(0.0); llListenRemove(gListen); } }
  13. Thanks for chiming in Rolig, I realise that these questions must be both a bit on the easy/boring side, as well as one's you've been asked many times before. In my searching for answers I found evidence of you helping out in the past on scripts very similar to mine (several times!). I realised my mistake about calling llDialog instead of the multipage routine right after I posted last time, so that's fixed already. The reason I am using llDIalog on the first touch, and then the multi-page routine later, is that I think what I want to do works best as a Menu/subMenu combination. The first menu (llDialog) presents the user with an announcement of what's going to happen and presents the "SCAN" button ... then the results of the scan are (necessarily) dropped into the multipage menu system, which handles the data. I'm not sure if it's correct, but that was the logic behind the choice. The trouble is that these two calls to Dialogue boxes are now fighting with each other. I press the "SCAN" button on the first dialogue box and it sometimes replaces with a blank box with an "OK" button for a moment, before then being replaced by the multipage dialogue box with the correct data. Because the whole scanning and invoking of the multipage dialogue box takes a while, I made it work by putting in the llSLeep command, but then what is displayed is the last (old) data from the previous scan (in multipage format), before a moment later being replaced by the new, correct, scan data. Either one creates a horrible user interaction and llSleep is definitely a kludge I don't want to use anyway. Sadly, I've also lost confidence that I even have the right approach for the task at hand. I realised that I probably need the avatars keys to do anything worthwhile with the named buttons at the end and I don't think you can find an avatars key with just the first 12 characters of their display names. I can collect the keys instead, but then I need a whole other routine (in the listen?) to parse that data into display names before dumping them in the dialogue? Or I need to collect two lists in the sensor (keys and names) and then associate them in a data structure with strided lists or something? Ack! The whole thing is a mess really, lol. the relevant code section: touch_start(integer total_number) { llDialog(llDetectedKey(0),"\n~Press SCAN for a list of avatars~\n", ["SCAN"],cmdChannel); llListenRemove(gListen); gMenuPos = 0; } sensor( integer number_detected ) { avatar_list = ["SCAN"]; integer i; for( i = 0; i < number_detected; i++ ){ if( llDetectedKey( i ) != llGetOwner() ){ string detected_name = llGetDisplayName(llDetectedKey( i )); avatar_list += llGetSubString(detected_name, 0, 11); } } llSleep(2.0); multipage_dialogue(); }
  14. Okay, so ... here is the code where I combined the multi-page button dialogue into what I already had as well as taking KT's simplification notes into account. I renamed a lot of stuff and formatted it so it's clearer because I'm a super visual person (thus why I suck at code), and I simply can't even read it unless I do that. It (sorta) works? Obviously there is a problem with the touch_start event in that I'm calling my original dialogue box and then calling the multi-page dialogue box function right after. If I comment out one or the other then it doesn't work at all, but the way it is currently, if I'm quick with hitting the SCAN button, then eventually it works fine and I get a multi-page dialogue with the correct forward and backward arrows and all the names of the avatars correctly formatted etc. So I'm 90% of the way there? I mean it's working ... but with problems, lol. I'm thinking that what I want is a first page menu where I invoke the scan and then the multipage dialogue thingie is a *sub menu of that? But I'm not sure how to do that either, lol. Anyway, here is what I have now for anyone still interested and thanks for all the help so far: Sylvia // Sylvia's avatar scan code (combined) // integer cmdChannel; integer gMenuPos; integer gListen; float sensor_range = 96.0; list avatar_list; integer Key2Chan(key ID) { return 0x80000000 | (integer)("0x"+(string)ID); } dialogue_box() { integer lastPage; list buttons; integer listLength = llGetListLength(avatar_list); if(gMenuPos >= 9) { buttons += " <----"; if((listLength - gMenuPos) > 11) { buttons += " ---->"; } else { lastPage = TRUE; } } else if (listLength > gMenuPos+9) { if((listLength - gMenuPos) > 11) { buttons += " ---->"; } else { lastPage = TRUE; } } else { lastPage = TRUE; } if (listLength > 0) { integer b_count; integer num_of_buttons = llGetListLength(buttons); for(b_count = gMenuPos + num_of_buttons + lastPage - 1 ; (num_of_buttons < 12) && (b_count < listLength); ++b_count) { buttons = buttons + [llList2String(avatar_list,b_count)]; num_of_buttons = llGetListLength(buttons); } } gListen = llListen(cmdChannel,"","",""); llSetTimerEvent(10.0); llDialog(llGetOwner()," \n",buttons,cmdChannel); } default { state_entry() { cmdChannel = Key2Chan(llGetOwner()); llListen(cmdChannel, "", llGetOwner(), ""); } touch_start(integer total_number) { llDialog(llDetectedKey(0),"\n~AVATAR LIST~\n", ["SCAN"],cmdChannel); llListenRemove(gListen); gMenuPos = 0; dialogue_box(); } sensor( integer number_detected ) { avatar_list = ["SCAN"]; integer i; for( i = 0; i < number_detected; i++ ){ if( llDetectedKey( i ) != llGetOwner() ){ string detected_name = llGetDisplayName(llDetectedKey( i )); avatar_list += llGetSubString(detected_name, 0, 11); } } llDialog(llGetOwner(), "\n avatars found ...", avatar_list, cmdChannel); } listen( integer channel, string name, key id, string message ) { llListenRemove(gListen); llSetTimerEvent(0.0); if( message == "SCAN" ){ llOwnerSay( "scanning for avatars within 96m ..." ); llSensor("", NULL_KEY, AGENT, sensor_range, PI); } else if (~llSubStringIndex(message,"---->")) { gMenuPos += 10; dialogue_box(); } else if (~llSubStringIndex(message,"<----")) { gMenuPos -= 10; dialogue_box (); } else { llOwnerSay(message); } } timer() { llSetTimerEvent(0.0); llListenRemove(gListen); } }
  15. thanks KT, all great suggestions I feel like a dummy for not seeing that easier list reset. So obvious once you see it, lol. I base most of my decisions on finding some example elsewhere, so lots of times it works, but is inappropriate to the setting or overly complicated. Sylvia
  16. Well, I would also like it to be as efficient and "clean" as possible, but yes it's most important that it fit the situation it was made for. OK, so if anyone's still interested, here is a "version 2" of the thing. - I've successfully dumped the list to "llDialog". - I've changed the sensor to read Display Names instead of the actual avatar names (no one seems to use those anymore) and truncated them at twelve characters. - I've made the sensor scan reset the list each time so it doesn't just get bigger and bigger with each scan, (which allowed me to remove the "reset" button). - I've simplified the nomenclature a bit and chopped out as much unnecessary stuff as possible. - I've added a bit to the end of the listen which would serve as an "action" for the avatar name buttons (currently it just says the name). I haven't dealt with the 12 button limit yet, because my intention is to (later on) dump the avatar_list to a multi-page dialog that expands to fit however long the list gets. I'm still working on understanding that part. I also need to add the "SCAN" button to the llDialog that lists the avatars names for better UI flow. What I don't understand is why I can't blend the "list" part with the "scan" part. Every time I put the llDialog command after the scan, (within the same else-if as the scan), it reads as either empty or as just the first name in the list. I seem to be forced to scan and list separately. Other than that, and the fact that I'm still not checking for the button limit (and the fact that I'm probably not dealing with the listen handle as I should), it seems to work. // Sylvia's avatar scan code (take 2) integer cmdChannel; list avatar_list; float sensor_range = 96.0; integer Key2Chan(key ID) { return 0x80000000 | (integer)("0x"+(string)ID); } default { state_entry() { cmdChannel = Key2Chan(llGetOwner()); llListen(cmdChannel, "", llGetOwner(), ""); } touch_start(integer total_number) { llDialog(llDetectedKey(0),"\n~AVATAR LIST~\n", ["SCAN","list"],cmdChannel); } sensor( integer number_detected ) { avatar_list = llDeleteSubList(avatar_list, 0, llGetListLength(avatar_list)); integer i; for( i = 0; i < number_detected; i++ ){ if( llDetectedKey( i ) != llGetOwner() ){ string detected_name = llGetDisplayName(llDetectedKey( i )); avatar_list += llGetSubString(detected_name, 0, 11); } } } listen( integer channel, string name, key id, string message ) { if( id != llGetOwner() ){ return; } else if( message == "SCAN" ){ llOwnerSay( "scanning for avatars within 96m ..." ); llSensor("", NULL_KEY, AGENT, sensor_range, PI); // why can't I put "llDialog" here? } else if( message == "list" ){ llDialog(llGetOwner(), "\n avatars found ...", avatar_list, cmdChannel); } else { llOwnerSay(message); } } }
  17. Thanks Rolig, It will take me a while to ingest this stuff of course but the multi-page dialogue code will be especially useful indeed. I probably won't use the numbered buttons thing. Scriptors won't understand this of course, but regular folks don't actually like numbers or numbered buttons. Even the worst formatted, garbled name is better than numbers. There is nothing worse than a dialogue on a piece of furniture that just has numbers for the poses for example. Currently the avatar list is a "scan once and done" kind of deal, I was intending to replace it with something that appends new names and removes names of avatars no longer detected. I was going to stick with a manual "rescan" button however, rather than rely on a timer as it seemed more efficient. Most of the time you're only going to scan once anyway and constantly scanning around for avatars seems resource wasteful no matter how you do it. As for what to do with the names once compiled, each name will be a button so I was thinking that any response from the dialogue that *wasn't* an expected command would obviously be someone pressing a button with an avatars name on it. So I would have an else-if at the end of the listen that executed the code on the avatars names. I will deal with all the avatar names as they are character-wise. Those who have chosen ridiculous (and ridiculously long) avatar names will just be out of luck (for being ridiculous), and it will be their loss. I'm a bit worried about escape characters, but I'm sure there is some way to deal with that. If I can identify a particularly useless sub-set of characters to screen out of the name strings I might do that, but with all the silly font nonsense that people do nowadays, it's unlikely that any particular character can be safely eliminated in that fashion. Probably I will just take the first twelve characters and truncate the name. thanks again, Sylvia
  18. Hello, I've been trying to write a script to scan for avatars in the area and turn the returned list into a set of dialogue buttons. I've got part of the way there. I can invoke the dialogue, and I've figured out the scanner part, but when it comes to feeding that info back into the dialogue I'm lost and so far the wiki has been no real help. I know in some cases the dialogue part is handled by a separate script instead of being included in the main script. Is that the way to go? here is the code I have already: // Sylvia's avatar scan code integer cmdChannel; list visitor_list; float sensor_range = 96.0; integer Key2Chan(key ID) { return 0x80000000 | (integer)("0x"+(string)ID); } integer isNameOnList( string name ) { integer len = llGetListLength( visitor_list ); integer i; for( i = 0; i < len; i++ ){ if( llList2String(visitor_list, i) == name ){ return TRUE; } } return FALSE; } default { state_entry() { cmdChannel = Key2Chan(llGetOwner()); llListen(cmdChannel, "", llGetOwner(), ""); } touch_start(integer total_number) { llDialog(llDetectedKey(0),"\n~VISITOR LIST~\n", ["find avatars","list","reset"],cmdChannel); } sensor( integer number_detected ) { integer i; for( i = 0; i < number_detected; i++ ){ if( llDetectedKey( i ) != llGetOwner() ){ string detected_name = llDetectedName( i ); if( isNameOnList( detected_name ) == FALSE ){ visitor_list += detected_name; } } } } listen( integer channel, string name, key id, string message ) { if( id != llGetOwner() ){ return; } else if( message == "find avatars" ){ llOwnerSay( "scanning for avatars within 96m ..." ); llSensor("", NULL_KEY, AGENT, sensor_range, PI); } else if( message == "list" ){ llOwnerSay( "avatar List:" ); integer len = llGetListLength( visitor_list ); integer i; for( i = 0; i < len; i++ ){ llOwnerSay( llList2String(visitor_list, i) ); } llOwnerSay("Total = " + (string)len ); } else if( message == "reset" ){ visitor_list = llDeleteSubList(visitor_list, 0, llGetListLength(visitor_list)); llOwnerSay("completed reset"); } } }
  19. Thanks for making the effort Qie, but I'm no closer to finding out *why* it might not be working for me. I followed the same instructions, checked the syntax a million times, etc. and it doesn't work for me on my own parcel. Yet, when I walk over to my neighbours parcel in the same sim, my windlights changes to her settings, (at least I'm assuming she uses parcel settings because the entire sim is a whiteout due to EEP otherwise) so obviously it should also work for mine. What I find missing in the Firestorm wiki on the subject is what settings in the viewer itself need to be ticked to make it all work. Like these: (see attached) as well as the little environment settings popup on the lower righthand bar. I'm assuming that the setting for my parcel is correct but I'm not seeing it because my Firestorm preferences are incorrect? Maybe? There is also no information anywhere on the horror that is EEP (which is the reason I'm trying to do this in the first place) and how that may or may not interact with Firestorms Windlight and Parcel settings. As I said my sim has been borked by EEP (thanks Linden Labs!) for over nine months now with no word on when if ever it will be fixed or what to do about it. It's difficult to troubleshoot a windlights problem when there is some un-named, un-known, and un-explainable "problem" with windlights settings in general. Especially when Linden Labs won't even talk about it.
  20. Hi, I've been trying to make parcel windlights work lately (because EEP has completely ruined my sim's wind light for the last 9 months or so), and I found this thread. I'd just like to say that it *doesn't* work for me at all, and that the Firestorm wiki that everyone points to (above) doesn't actually help at all! It tells you how to set it, but it's pretty silent on what to do if it doesn't work, or what the settings in Firestorm are that allow you to see it. I've tried all the settings and checked my syntax a zillion times and it just doesn't work and there is *nothing* from Firestorm that I can find on what to do if it doesn't work or possible reasons why it doesn't work etc. It *does* work on other people's parcels in the same sim as me so ... WTF?
  21. I can't mesh OR script, lol. I rely on full perm mesh to make my clothes and the pickings are mighty slim indeed. I am a superb prim-smith and can make almost anything with them but sadly that skill is completely redundant now too
  22. Thanks Rolig, This will get me started at least. I was looking in-world for your store, but I guess you meant "used to have a store"? Sylvia
  23. "Holovendor!" that was the word I couldn't remember, lol.
  24. Good info, thanks I'm thinking if I had any at all, I might have like, one in my shop. I'm not thinking of replacing my regular vendors with them. Since I wrote my own vendors, I believe I could probably handle the code if I got some clues as to where to start. I think they might be a good option for things like skirts & panties etc., in that these items often sell in multi-packs with a texture changing HUD, but the buyer only really wants that one skirt or that one panty set. The seller's options are either to have a whole wall of product, or to sell one product with a HUD full of questionable texture options Also, a lot of sellers seem to think that a $150 skirt, with a 12 texture HUD is actually worth 12 x $150 (minus some tiny discount), when it's really not worth anything like that to the buyer because 10 of those 12 textures will never be used. I know this situation really frustrates me when I go to buy things. If a temp rez skirt/panty vendor displayed say a hundred items, then the buyer could simply pick the three colours/patterns they like instead of buying multiple texture packs. It would be more honest, more like a real store and definitely better for the buyer. I think it also might give the seller more money in the end anyway. Sylvia Edit: I forgot all this time to say another big reason I'm interested ... I put a lot of time and effort into the textures and especially the materials effects on my clothes, but the box art can't really convey this, so displaying the item in a "real-world" environment so you can see the shine or the normal map effects etc. is a definite bonus. Items look far better "in person" with the new materials effects than they ever could in a picture.
  25. Hello, This may not make sense to anyone who hasn't been in SL for a long while but I was thinking that it would be nice to have a 3D vendor again, (they go by many names but that's what my friends and I used to call them). The idea was that using PRIM_TEMP_ON_REZ, a vendor (which was usually just a plinth with forward and backward arrows), would rez the actual prim object (as TEMP) floating just above the plinth. The user could then use the arrows to cycle through the products. Each one being rezzed in similar fashion. Right-clicking on the temp object, would initiate the sale of the real object from inside the vendor. So first off ... is this still possible or has it been deprecated? Secondly, if it's possible, does anyone have code? I already have old-school vendors that I made myself with a central prim and the two backward and forward arrows, so it seems to me that this version would be easily adaptable to the code I already have. In terms of why people stopped using them, I remember that they could be laggy, and that complicated objects took a while to appear. However, I'm thinking in the age of mesh that we are now in, that rendering would be lickety-split as it were for single mesh objects, when the user is standing literally right in front of the vendor. For instance a skirt vendor, might only have two or three mesh objects in an inventory of hundreds of skirts because the thing that differentiates the skirts would primarily be the pattern. Anyone have any ideas or input on this thing? I think these vendors were seriously cool and would love to have them again. 🙂 If it's possible at all, what I'm looking for is code to modify my own vendors so that instead of just changing the picture on the vendor, it actually displays a temp rez mesh above or in front of the vendor. Sylvia Edit: I'm also looking for all the myriad reasons & opinions (I'm sure they are out there, lol) as to why this isn't a good idea. Let me have it! 😄
×
×
  • Create New...