Jump to content

Indeterminate Schism

Resident
  • Posts

    351
  • Joined

  • Last visited

Posts posted by Indeterminate Schism

  1. 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!

  2. 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();
    		}
    	}
    }

     

    • Like 1
    • Thanks 1
  3. 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?

  4. 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.

    • Like 2
  5. 
    

    ... 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.

  6. 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

  7. 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?

  8. 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.

  9. Each rezzed object has its own UUID and it is generated anew each time the object is rezzed.  Because of that, if you take or delete the object and later rezz it again it will have a different UUID.  For textures and other things that are not rezzed directly you will usually only be able to get the UUID from your inventory (as BlackCobra has explained) if you have the proper permissions.  If you aren't allowed to use the texture in this way the 'Copy UUID' option will be greyed-out in the menu.

    • Like 1
  10. "Instead of using prims"

    You can't change the water but you can change the land (assuming you have terraforming permission)

    1.  Use the land tools to raise the land-level under what is usually water to match the water-level (20m by default)

    2.  Import a new land-texture (RAW) file that makes the relevant area look like ice

    There, solid and textured.  In the Spring just drop the land-level again and re-apply your original land-texture

  11. I think you have all the answers and information you need Mystiphi - I just wanted to add 'thanks for asking this question.  It shows that you are really thinking of how to give people the best experience you can, even if that isn't the 'obvious' his-res wy."

  12. A sky box is a house designed or intended to be used in the sky rather than on the ground.  This is a common option in SL as it means people can keep the ground-level of their land for attractive or peacful gardens.  Alternatively, if the ground-level and/or neighbours are just plain horrible it means you can get away from them by going for altitude.

    To use one, you'll need some land to live on.  Then rezz the skybox and position it to the height you want.

    • Like 1
  13. I've read all I can find about these functions and can't find *any* mention of permissions required but I will check further.  Presumably the object containing the script has to be deeded to the group, just as for setting Media, but that would mean anyone with privileges to deed objects to the group could use these functions for griefing and it makes land-bans practically worthless.  Hehe, I must write a few security systems quickly.

  14. I don't think it will break "much" content because that would be almost instant suicide for LL, rather than the lingering death by a thousands cuts they seem to prefer.  On the other hand if it doesn't break "any" content there wouldn't be much point in introducing it.  The intention is to restrict the heaviest users.  As yet, though, there are no authoritative details on even HOW scripts will be limited so it's really too early to say whether it will be by memory in the end, as Babbage Linden has mooted.

×
×
  • Create New...