Jump to content

Indeterminate Schism

Resident
  • Content Count

    351
  • Joined

  • Last visited

Community Reputation

9 Neutral

About Indeterminate Schism

  • Rank
    Advanced Member
  1. I'm sorry, what line do you have an error on? This has just been checked by another couple of people in response to your post and we have no problems with it.
  2. Solution handling selectable-axis resizing for linksets where child prims are at 'cardinal-point' rotations relative to the root is in the library here: http://community.secondlife.com/t5/LSL-Library/Selectable-axis-Resizer/td-p/872705
  3. There are no tools for capturing settings from another script but there are ones for helping you to generate your own. They tend to have names like 'Particle Factory' so have a look on the marketplace or search for that. A quick look on marketplace gives me, as an example that I haven't tried so can't recommend, https://marketplace.secondlife.com/p/EASY-FX-Particle-Generator-Effects-Creator-Script-Generator-only-2-Prim-Create-FULL-PERM-Scripts/2122846?ple=c They will be others!
  4. The script below allows you to set, or restore, the scaling of all prims in a linkset along selectable axis - that is, control X, Y and Z rescaling independently. Two or all axes may be selected and controlled at once if desired. This script may be controlled by menu or link-messages (see comments in script). NB: There is a major restriction on the utility of this script - all prims to be resized must be at 'cardinal point' rotations relative to the root - each axis must be 0, 90, 180 or 270 degrees. At the moment there is no known solution that will handle all rotations. // Resize Cardinal // // =============== // // Version 1.2 // By Indeterminate Schism of Script Sisters group // Developed from earlier work by Void Singer, Dora Gustafson, Brilliant Scientist, Ann Otoole, Maestro Linden // and probably others whose names have got lost in all the excitement // Independent selection of x, y, z axes for scaling linksets // Restore to original sizes/positions option (per axis) // NB: RESTRICTION - all prims must be rotated at cardinal points (0, 90, 180, 270 degrees) relative to the root prim // Menu displays maxima, current and minima scaling for each axis // Delete script menu option with confirm/cancel sub-menu // Includes menu-timeout to close menu listener // Uses hovertext to store original sizes, rotations and positions (removed when script deleted through menu) // Accepts llMessageLinked() string "RESIZE:<scale>", eg; RESIZE:<1.5, 2.0, -0.5> (checked for maxima/minima bounds before processing) // Settings may be queried with string "RESIZEQUERY" - returns string consisting of <maxima>_<current>_<minima> vectors // Global Variables // ---------------- vector Axes = ZERO_VECTOR; // Axes along which object is being resized integer Delete = FALSE; // Flag for script-delete menu string MapAxis; // Axis-mapping for the prim being calculated vector Maxima = ZERO_VECTOR; // Maximum dimensions in the object, read at state_entry integer MenuListen; // Handle to remove menu-listen vector Minima; // Minimum dimensions in the object, read at state_entry vector Scale; // Amount by which to resize each axis CloseListen(){ // Stop the timer and listener and reset the handle llSetTimerEvent(0.0); if(MenuListen){ llListenRemove(MenuListen); MenuListen = 0; } } float Map(integer Axis){ // Return the scale axis for this mapping string Use = llGetSubString(MapAxis, Axis, Axis); if("X" == Use){return Scale.x;} if("Y" == Use){return Scale.y;} if("Z" == Use){return Scale.z;} llOwnerSay("Map Failure: " + (string) MapAxis); return 1.0; } Menu(){ // 'Standard' menu buttons - 99% of the time these are the values that will be used list MenuButtons = ["Restore", "Exit", "Delete"]; string MenuMessage = "Scale:\nMax: " + (string) Maxima + "\nNow: " + (string) Scale + "\nMin: " + (string) Minima; if(Delete){ // Delete-confirmation menu MenuButtons = ["Confirm", "Cancel"]; MenuMessage = "Are you sure you want to delete this resize script?"; }else{ // Axes and scale buttons if(Axes.x){MenuButtons += ["X •"];}else{MenuButtons += ["X"];} if(Axes.y){MenuButtons += ["Y •"];}else{MenuButtons += ["Y"];} if(Axes.z){MenuButtons += ["Z •"];}else{MenuButtons += ["Z"];} MenuButtons += ["-0.05","-0.10","-0.25", "+0.05","+0.10","+0.25"]; } // Show the menu integer MenuChannel = -(integer) (llFrand(999999999.9) + 1); MenuListen = llListen(MenuChannel, "", llGetOwner(), ""); llDialog(llGetOwner(), MenuMessage, MenuButtons, MenuChannel); llSetTimerEvent(30.0); } Resize(){ // Check scaling is within maxima/minima bounds if(Scale.x < Minima.x){Scale.x = Minima.x;}else if(Scale.x > Maxima.x){Scale.x = Maxima.x;} if(Scale.y < Minima.y){Scale.y = Minima.y;}else if(Scale.y > Maxima.y){Scale.y = Maxima.y;} if(Scale.z < Minima.z){Scale.z = Minima.z;}else if(Scale.z > Maxima.z){Scale.z = Maxima.z;} // Resize and position everything string Axis; integer Counter = llGetNumberOfPrims(); integer Index; vector NewPos; vector NewSize; list Originals; rotation RootRot = llGetRootRotation(); if(1 == Counter){ // Single-prim, just scale it Originals = llParseString2List(llList2String(llGetLinkPrimitiveParams(0, [PRIM_TEXT]), 0), ["?"], []); NewSize = (vector) llList2String(Originals, 0); NewSize.x *= Scale.x; NewSize.y *= Scale.y; NewSize.z *= Scale.z; llSetLinkPrimitiveParamsFast(0, [PRIM_SIZE, NewSize]); }else{ // Resize the mapped axis for each prim and then reposition it relative to the root while(Counter){ Originals = llParseString2List(llList2String(llGetLinkPrimitiveParams(Counter, [PRIM_TEXT]), 0), ["?"], []); NewSize = (vector) llList2String(Originals, 0); MapAxis = llList2String(Originals, 1); // Find the axis-mapping for this prim's rotation - don't resize the prim if at unmapped rotation if("!!!" != MapAxis){ NewSize.x *= Map(0); NewSize.y *= Map(1); NewSize.z *= Map(2); } NewPos = (vector) llList2String(Originals, 2); NewPos.x *= Scale.x; NewPos.y *= Scale.y; NewPos.z *= Scale.z; if(1 == Counter){ // Just rescale the root llSetLinkPrimitiveParamsFast(Counter--, [PRIM_SIZE, NewSize]); }else{ // Rescale and reposition everything else llSetLinkPrimitiveParamsFast(Counter--, [PRIM_SIZE, NewSize, PRIM_POSITION, NewPos]); } } } // Redisplay the menu for next command Menu(); } string RoundVec(vector In){ return "<" + (string) llRound(In.x) + "," + (string) llRound(In.y) + "," + (string) llRound(In.z) + ">"; } string TrimFloat(float In){ // Remove trailing-zeros and possible decimal point from a float string Temp = (string) In; while("0" == llGetSubString(Temp, -1, -1)){Temp = llDeleteSubString(Temp, -1, -1);} if("." == llGetSubString(Temp, -1, -1)){Temp = llDeleteSubString(Temp, -1, -1);} return Temp; } string TrimVec(vector In){ // Trim each float in a vector return "<" + TrimFloat(In.x) + "," + TrimFloat(In.y) + "," + TrimFloat(In.z) + ">"; } default{ link_message(integer FromPrim, integer Number, string Text, key UUID){ // Only the Text parameter is relevant if("RESIZEQUERY" == Text){ // Return <maxima>_<current>_<minima> vectors llMessageLinked(FromPrim, Number, (string) Maxima + "_" + (string) Scale + "_" + (string) Minima, UUID); }else if("RESIZE:" == llGetSubString(Text, 0, 6)){ // Scale to given vector Scale = (vector) llDeleteSubString(Text, 0, 6); Resize(); } } listen(integer ChannelIn, string FromName, key FromID, string Message){ // Process menu selections CloseListen(); if((float) Message){ // A numeric, therefore a scaling factor if(Axes.x){Scale.x += (float) Message;} if(Axes.y){Scale.y += (float) Message;} if(Axes.z){Scale.z += (float) Message;} Resize(); }else{ // Must be some other command if("Cancel" == Message){ // Cancel script-deletion Delete = FALSE; Menu(); }else if("Confirm" == Message){ // Delete this script, but first remove all the prim text integer Counter = llGetNumberOfPrims(); if(1 == Counter){ llSetLinkPrimitiveParamsFast(0, [PRIM_TEXT, "", ZERO_VECTOR, 0.0]); }else{ while(Counter){ llSetLinkPrimitiveParamsFast(Counter--, [PRIM_TEXT, "", ZERO_VECTOR, 0.0]); } } llOwnerSay("Script deleted"); llRemoveInventory(llGetScriptName()); }else if("Delete" == Message){ // Show delete-confirmation menu Delete = TRUE; Menu(); }else if("Exit" == Message){ // Do nothing }else if("Restore" == Message){ // Reset the sizes and positions to the original values if(Axes.x){Scale.x = 1.0;} if(Axes.y){Scale.y = 1.0;} if(Axes.z){Scale.z = 1.0;} Resize(); }else{ Message = llGetSubString(Message, 0, 0); if("X" == Message){Axes.x = !(integer) Axes.x;} else if("Y" == Message){Axes.y = !(integer) Axes.y;} else if("Z" == Message){Axes.z = !(integer) Axes.z;} Menu(); } } } state_entry(){ // Initiaisation llOwnerSay("Initialising, please wait ..."); integer Counter = llGetNumberOfPrims(); float MaxDim = 10.0; float MinDim = 0.01; if(1 == Counter){ // I don't know why anyone would use this for a single prim, but it's here anyway Maxima = llList2Vector(llGetLinkPrimitiveParams(0, [PRIM_SIZE]), 0); Minima = Maxima; llSetLinkPrimitiveParamsFast(Counter, [PRIM_TEXT, TrimVec(Maxima), ZERO_VECTOR, 0.0]); }else{ // Check each prim in the linkset - temporarily set the object to zero rotation to minimise rounding errors list AxisMap = ["<0,0,0>", "XYZ", "<0,0,90>", "YXZ", "<0,0,180>", "XYZ", "<0,0,-90>", "YXZ", "<0,90,0>", "ZYX", "<0,90,90>", "YZX", "<0,90,-180>", "ZYX", "<0,90,-90>", "YZX", "<180,0,180>", "XYZ", "<180,0,-90>", "YXZ", "<180,0,0>", "XYZ", "<-180,0,90>", "YXZ", "<0,-90,0>", "ZYX", "<0,-90,90>", "YZX", "<0,-90,-180>", "ZYX", "<0,-90,180>", "ZYX", "<0,-90,-90>", "YZX", "<90,0,0>", "XZY", "<90,0,90>", "ZXY", "<90,0,180>", "XZY", "<90,0,-90>", "ZXY", "<-90,0,180>", "XZY", "<-90,0,-90>", "ZXY", "<-90,0,0>", "XZY", "<-90,0,90>", "ZXY", "<-180,0,0>", "XYZ"]; integer Index; string LinkRot; vector LinkScale; Minima = <MaxDim, MaxDim, MaxDim>; vector RootPos = llGetPos(); rotation WasRot = llGetRot(); llSetRot(ZERO_ROTATION); while(Counter){ // Find the axis-mapping for the prim. Prim-rotation (reduced to a vector) is rounded to reduce 'insignificant' variations LinkRot = RoundVec(llRot2Euler(llList2Rot(llGetLinkPrimitiveParams(Counter, [PRIM_ROTATION]), 0) / ZERO_ROTATION) * RAD_TO_DEG); LinkScale = llList2Vector(llGetLinkPrimitiveParams(Counter, [PRIM_SIZE]), 0); Index = llListFindList(AxisMap, [LinkRot]); if(++Index){ // Valid mapping - include this in minima/maxima calculations Scale = LinkScale; MapAxis = llList2String(AxisMap, Index); LinkScale.x = Map(0); LinkScale.y = Map(1); LinkScale.z = Map(2); if(LinkScale.x < Minima.x){Minima.x = LinkScale.x;}else if(LinkScale.x > Maxima.x){Maxima.x = LinkScale.x;} if(LinkScale.y < Minima.y){Minima.y = LinkScale.y;}else if(LinkScale.y > Maxima.y){Maxima.y = LinkScale.y;} if(LinkScale.z < Minima.z){Minima.z = LinkScale.z;}else if(LinkScale.z > Maxima.z){Maxima.z = LinkScale.z;} }else{ // Mark this prim not to be resized MapAxis = "!!!"; llOwnerSay("Link " + (string) Counter + " unhandled rotation " + LinkRot + " - won't be resized"); } llSetLinkPrimitiveParamsFast(Counter, [PRIM_TEXT, TrimVec(LinkScale) + "?" + MapAxis + "?" + TrimVec((llList2Vector(llGetLinkPrimitiveParams(Counter--, [PRIM_POSITION]), 0) - RootPos) / ZERO_ROTATION), ZERO_VECTOR, 0.0]); } llSetRot(WasRot); } // Convert those to valid scaling bounds Maxima.x = MaxDim / Maxima.x; Maxima.y = MaxDim / Maxima.y; Maxima.z = MaxDim / Maxima.z; Minima.x = MinDim / Minima.x; Minima.y = MinDim / Minima.y; Minima.z = MinDim / Minima.z; Scale = <1.0, 1.0, 1.0>; llOwnerSay("Ready - touch for menu"); } timer(){ // Menu time-out llOwnerSay("Menu timed-out. Touch again to reactivate it"); Delete = FALSE; CloseListen(); } touch_start(integer HowMany){ // Show the menu to the owner if(llDetectedKey(0) == llGetOwner()){ CloseListen(); Menu(); } } }
  5. I've made a few tweaks and tidies but nothing significant. I'll put this in the library with a big warning at the top and suggested adjustments just for good measure. (PRIM_DESC instead of PRIM_TEXT, that sort of thing) Or not. I want to at least handle cardinal-point rotations first, even if it isn't necessary in this special case. @ Void, Dora - I really ought to avoid storing each prim's original size/position too, as you have. This seemed to offer better protection against rounding errors but if you're happy just checking the root's current scaling I'll take your word for it. Any other advice?
  6. Can't stay away from SL. (/me waves) What happened to you lot while I was away? Hadra specifies that her prims will all be aligned with the root, which keeps it simple. So I wrote this: // Resize Axis //// =========== //// Version 0.1// By Indeterminate Schism of Script Sisters group// Developed from earlier work by Void Singer, Brilliant Scientist, Ann Otoole, Maestro Linden// and probably others whose names have got lost in all the excitement// Resize single prims or linksets along specified axis/axes// NB: RESTRICTION - all prims must share the same rotation - this was developed for that specific situation as required by Hada Sabra// Independent selection of x, y, z axes for scaling// Includes menu-timeout to close listener// Not limited by script memory, uses hovertext to store original sizes and positions (removed when script deleted through menu)// Delete script menu option with confirm/cancel sub-menu// Revert to original sizes/positions option// Display of maxima, current and minima scaling for each axis// Accepts llMessageLinked() string "RESIZE:<scale>", eg; RESIZE:<1.5, 2.0, -0.5> (checked for maxima/minima bounds before processing)// Settings may be queried with string "RESIZEQUERY" - returns string consisting of <maxima>_<current>_<minima> vectors// Global Variables// ----------------vector Axes = ZERO_VECTOR; // Axes along which object is being resizedinteger Delete = FALSE; // Flag for script-delete menufloat MaxDim = 10.0; // Constant - no dimension may be greater than thisvector Maxima = ZERO_VECTOR; // Maximum dimensions in the object, read at state_entryinteger MenuListen; // Handle to remove menu-listenfloat MinDim = 0.01; // Constant - no dimension may be smaller than thisvector Minima = <10.0, 10.0, 10.0>; // Minimum dimensions in the object, read at state_entryvector Scale = <1.0, 1.0, 1.0>; // Amount by which to resize each axisCloseListen(){ // Stop the timer and listener and reset the handle llSetTimerEvent(0.0); if(MenuListen){ llListenRemove(MenuListen); MenuListen = 0; }}Menu(){ // 'Standard' menu buttons - 99% of the time these are the values that will be used list MenuButtons = ["Restore", "Done", "Delete"]; string MenuMessage = "Scale:\nMax: " + (string) Maxima + "\nNow: " + (string) Scale + "\nMin: " + (string) Minima; if(Delete){ // Delete-confirmation menu MenuButtons = ["Confirm", "Cancel"]; MenuMessage = "Are you sure you want to delete this resize script?"; }else{ // Axes and scale buttons if(Axes.x){MenuButtons += ["X •"];}else{MenuButtons += ["X"];} if(Axes.y){MenuButtons += ["Y •"];}else{MenuButtons += ["Y"];} if(Axes.z){MenuButtons += ["Z •"];}else{MenuButtons += ["Z"];} MenuButtons += ["-0.05","-0.10","-0.25", "+0.05","+0.10","+0.25"]; } // Show the menu integer MenuChannel = -(integer) (llFrand(999999999.9) + 1); MenuListen = llListen(MenuChannel, "", llGetOwner(), ""); llDialog(llGetOwner(), MenuMessage, MenuButtons, MenuChannel); llSetTimerEvent(30.0);}Resize(){ // Check scaling is within maxima/minima bounds if(Scale.x < Minima.x){Scale.x = Minima.x;}else if(Scale.x > Maxima.x){Scale.x = Maxima.x;} if(Scale.y < Minima.y){Scale.y = Minima.y;}else if(Scale.y > Maxima.y){Scale.y = Maxima.y;} if(Scale.z < Minima.z){Scale.z = Minima.z;}else if(Scale.z > Maxima.z){Scale.z = Maxima.z;} // Resize and position everything integer Counter = llGetNumberOfPrims(); if(1 == Counter){ list Originals = llParseString2List(llList2String(llGetLinkPrimitiveParams(0, [PRIM_TEXT]), 0), ["\n"], []); vector NewSize = (vector) llList2String(Originals, 0); NewSize.x *= Scale.x; NewSize.y *= Scale.y; NewSize.z *= Scale.z; llSetLinkPrimitiveParamsFast(0, [PRIM_SIZE, NewSize]); }else{ while(Counter){ list Originals = llParseString2List(llList2String(llGetLinkPrimitiveParams(Counter, [PRIM_TEXT]), 0), ["\n"], []); vector NewSize = (vector) llList2String(Originals, 0); NewSize.x *= Scale.x; NewSize.y *= Scale.y; NewSize.z *= Scale.z; vector NewPos = (vector) llList2String(Originals, 1); NewPos.x *= Scale.x; NewPos.y *= Scale.y; NewPos.z *= Scale.z; if(1 == Counter){ // Just rescale the root llSetLinkPrimitiveParamsFast(Counter--, [PRIM_SIZE, NewSize]); }else{ // Rescale and reposition everything else llSetLinkPrimitiveParamsFast(Counter--, [PRIM_SIZE, NewSize, PRIM_POSITION, NewPos]); } } } // Redisplay the menu for next command Menu();}default{ link_message(integer FromPrim, integer Number, string Text, key UUID){ // Only the Text parameter is relevant if("RESIZEQUERY" == Text){ // Return <maxima>_<current>_<minima> vectors llMessageLinked(FromPrim, Number, (string) Maxima + "_" + (string) Scale + "_" + (string) Minima, UUID); }else if("RESIZE:" == llGetSubString(Text, 0, 6)){ // Scale to given vector Scale = (vector) llDeleteSubString(Text, 0, 6); Resize(); } } listen(integer ChannelIn, string FromName, key FromID, string Message){ // Process menu selections CloseListen(); if((float) Message){ // A numeric, therefore a scaling factor if(Axes.x){Scale.x += (float) Message;} if(Axes.y){Scale.y += (float) Message;} if(Axes.z){Scale.z += (float) Message;} Resize(); }else{ // Must be some other command if("Cancel" == Message){ // Cancel script-deletion Delete = FALSE; Menu(); }else if("Confirm" == Message){ // Delete this script, but first remove all the prim text integer Counter = llGetNumberOfPrims(); if(1 == Counter){ llSetLinkPrimitiveParamsFast(0, [PRIM_TEXT, "", ZERO_VECTOR, 0.0]); }else{ while(Counter){ llSetLinkPrimitiveParamsFast(Counter--, [PRIM_TEXT, "", ZERO_VECTOR, 0.0]); } } llRemoveInventory(llGetScriptName()); llOwnerSay("Script deleted"); }else if("Done" == Message){ // Do nothing }else if("Delete" == Message){ // Show delete-confirmation menu Delete = TRUE; Menu(); }else if("Restore" == Message){ // Reset the sizes and positions to the original values Scale = <1.0, 1.0, 1.0>; Resize(); }else{ Message = llGetSubString(Message, 0, 0); if("X" == Message){Axes.x = !(integer) Axes.x;} else if("Y" == Message){Axes.y = !(integer) Axes.y;} else if("Z" == Message){Axes.z = !(integer) Axes.z;} Menu(); } } } state_entry(){ // Find the largest and smallest prim dimensions, store sizes and positions to prim text llOwnerSay("Initialising, please wait ..."); integer Counter = llGetNumberOfPrims(); if(1 == Counter){ // I don't know why anyone would use this for a single prim, but it's here anyway Maxima = llList2Vector(llGetLinkPrimitiveParams(0, [PRIM_SIZE]), 0); Minima = Maxima; llSetLinkPrimitiveParamsFast(Counter, [PRIM_TEXT, (string) Maxima, ZERO_VECTOR, 0.0]); }else{ vector RootPos = llGetRootPosition(); rotation RootRot = llGetRootRotation(); while(Counter){ vector LinkScale = llList2Vector(llGetLinkPrimitiveParams(Counter, [PRIM_SIZE]), 0); if(LinkScale.x < Minima.x){Minima.x = LinkScale.x;}else if(LinkScale.x > Maxima.x){Maxima.x = LinkScale.x;} if(LinkScale.y < Minima.y){Minima.y = LinkScale.y;}else if(LinkScale.y > Maxima.y){Maxima.y = LinkScale.y;} if(LinkScale.z < Minima.z){Minima.z = LinkScale.z;}else if(LinkScale.z > Maxima.z){Maxima.z = LinkScale.z;} llSetLinkPrimitiveParamsFast(Counter, [PRIM_TEXT, (string) LinkScale + "\n" + (string) ((llList2Vector(llGetLinkPrimitiveParams(Counter--, [PRIM_POSITION]), 0) - RootPos) / RootRot) , ZERO_VECTOR, 0.0]); } } // Convert those to valid scaling bounds Maxima.x = MaxDim / Maxima.x; Maxima.y = MaxDim / Maxima.y; Maxima.z = MaxDim / Maxima.z; Minima.x = MinDim / Minima.x; Minima.y = MinDim / Minima.y; Minima.z = MinDim / Minima.z; llOwnerSay("Ready - touch for menu"); } timer(){ // Menu time-out llOwnerSay("Menu timed-out. Touch again to reactivate it"); Delete = FALSE; CloseListen(); } touch_start(integer HowMany){ // Show the menu to the owner if(llDetectedKey(0) == llGetOwner()){ CloseListen(); Menu(); } }} It's not sufficiently tested to put in the library yet so comments/critique welcome. I'm also concerned that that 'all prims must share the same rotation' is too big a restriction for this to have much more than academic interest. What we need is a mathematician that can work out how to resize for an arbitary rotation. That's way beyond me.
  7. ... so hopefully if we chew on the right ears, we can get the changes made here that need to be done That's my hollow laugh you can hear fading away as I leave SL. No action on customer feedback is the lasting memory I'm taking with me.
  8. This problem is identical to the one in the 'permissions question' thread. Interesting that they should both come up at the same time. ETA: 'identical' in the behind-the-scenes, technical sense, I wouldn't have necessarily expected anyone to connect the two if they didn't already know the answer
  9. Pah! The fun I miss when I only log in a couple of times per week :-( I've had a lot of trouble on the couple of occassions I've tried to post code here. Eventually I copied from LSL editor into notepad and then to here. Can you tell me more about how you used the editor instead?
  10. I've always tended to build my shops so I can 'live over the store'. As long as you're within prim-limits I haven't found a landowner who objects to this at all
  11. As I understand it the way to ensure sculpties do not deform badly is to ensure that the folding is correct. Having said that, I have no idea what it means! The best place to ask is in the 'building tips' forum at http://forums.secondlife.com/, where there are always lots of questions (and answers!) to sculpty questions.
  12. I second Claire - qavimator is great unless you want to spend a whole lot of money. NCI do classes in animation creation and use. One thing to note is that a 'static' pose is actually at least 2 frames and that it should be looped to play continuously.
  13. And seriously, 'cause I was pulling your chain before, are you ok from there? (customise voice-gestures to chat some command on a channel. Have your script listen on that channel for the command. Activate whatever it is in the listen event in the script)
  14. Sorry psycho, you chose the name and set the mood in the OP. But you took my hints about the forum, groups and lists, yes? I'll see you in scripting tips
  15. Naahhhh, my 26-odd years professional programming experience just isn't enough to overcome only 2 years LSL scripting. As I'd hate to be called a wiseguy - or any sort of guy for that matter - I will say nothing and look forward to sicko's Syko's explanation of how it's done. 'course, I might be tempted to slide over to the 'scripting tips' forum or maybe ask in one of the scripters' groups or mailing lists while I'm waiting. Or I could toddle off and write some app outside SL that interfaced with my mic and sent info to SL. Then again, I might not. After all, no-one's paying me for something I can't do.
×
×
  • Create New...