User:Daemonika Nightfire/Scripts/*DS* Resize Script

From Second Life Wiki
Jump to navigation Jump to search

*DS* Resize Example v3.0.00

Single resize script for a complete linkset with save and restore option. <source lang="lsl2"> // // ╔═════════════════════════════════════−−−­­­­­­→ // ║ *DS* Resize Example by Daemonika Nightfire (daemonika.nightfire) // ╚══════════════════════−−−­­­→ // // Resize Script for rezzed Objects and Attachments. // Single-script for a complete linkset with save and restore option. // // Featueres: // • By the first run or reset of this script, it will ask you to save all parameters. // The parameters will be stored in the descriptionfield of each prim, that needs no script-memory :) // • You can save, resize and restore individual prims or the complette linkset. // // Important: // • Undersize is possible, but take care. // if you are small your object and several prims already have minimum dimensions, they are not further reduced, but they are moved proportionally. // • Sculpted Prims are no problem, but take care. // Sculpties with moved Bounding Box perhaps moving optical not correct // That is not true, they are moving correctly, but when the visible Sculptie is not the center of the Bounding Box, it will be looking wrong. // // Terms of use: // You can use, edit and sell this script inside your creations with the following permissions in Second Life: // • MOD Yes • COPY Yes • TRANSFER Yes // // Yes that means fullperm. Other settings, are against the following licenses. // The permission of your Object (prim), remain unaffected by these terms // // https://wiki.secondlife.com/wiki/User:Daemonika_Nightfire/Scripts/*DS*_Resize_Script // http://wiki.secondlife.com/wiki/Project:Terms_of_Service // http://creativecommons.org/licenses/by-sa/3.0/ // // violation of this Terms are against the Second Life TOS at §7 Content Licenses and Intellectual Property Rights. // http://secondlife.com/corporate/tos.php //

key owner; integer New = 1;

integer LinkSet = 1; integer Prim; integer Links; list Percent = ["-1%","-5%","-10%","+1%","+5%","+10%"]; list Ratio = [0.99,0.95,0.90,1.01,1.05,1.10];

integer Channel; integer Listener; Chan() {

   llListenRemove(Listener);
   Channel = (integer)(llFrand(1) * -DEBUG_CHANNEL);
   Listener = llListen(Channel, "", owner, "");
   llSetTimerEvent(60);

}

menu1() {

   Chan();
   if(New)
   {
       llDialog(owner, "\nYour first run or reset of this script.\nDo you whish to save current parameters?",
       ["Save","Later"], Channel);
   }
   else
   {
       llDialog(owner, "\nselect an option\nThis = touched Prim\nAll = complete Object",
       ["This","All","Done"], Channel);
   }

}

menu2() {

   Chan();
   llDialog(owner, "\n+ - = resize\nSave = record all parameters\nRestore = restore saved parameters",
   ["Save","Restore","Done"] + Percent, Channel);

}

default {

   state_entry()
   {
       owner = llGetOwner();
       llOwnerSay("/me " + llGetScriptName() + " Free Memory: " + (string)llGetFreeMemory() + " bytes.");
   }
   
   touch_start(integer total_number)
   {
       owner = llGetOwner();
       if(llDetectedKey(0) == owner)
       {
           Links = llGetNumberOfPrims();
           Prim = llDetectedLinkNumber(0);
           menu1();
       }
   }
   
   listen(integer channel, string name, key id, string msg)
   {
       float shift = 0;
       
       if(msg == "Done" || msg == "Later")
       {
           llListenRemove(Listener);
           llSetTimerEvent(0);
       }
       
       else if(~llListFindList(["This","All"], [msg]))
       {
           integer i = llListFindList(["This","All"], [msg]);
           if(i != -1)
           {
               LinkSet = i;
               menu2();
           }
       }
       
       else if(~llListFindList(Percent, [msg]))
       {
           integer i = llListFindList(Percent, [msg]);
           if(i != -1)
           {
               shift = llList2Float(Ratio, i);
           }
       }
       
       // Record
       else if(msg == "Save")
       {
           llOwnerSay("Please wait...");
           integer i = 0;
           do
           {
               list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE , PRIM_POS_LOCAL]);
               vector size = llList2Vector(params, 0);
               vector position = llList2Vector(params, 1);
               
               if(i > 1)
               {
                   llSetLinkPrimitiveParamsFast(i,[PRIM_DESC,(string)size + "#" + (string)position]);
               }
               else
               {
                   llSetLinkPrimitiveParamsFast(i,[PRIM_DESC,(string)size]);
               }
           }
           while(++i <= Links);
           New = 0;
           
           llOwnerSay("All parameters have been stored.");
           menu1();
       }
       
       // Restore
       else if(msg == "Restore")
       {
           if(!New)
           {
               llOwnerSay("Please wait...");
               if(!LinkSet)
               {
                   list params = llGetLinkPrimitiveParams(Prim, [PRIM_DESC]);
                   list parsed = llParseString2List(llList2CSV(params), ["#"], []);
                   string vect = llList2String(parsed, 0);
                   vector size = (vector)vect;
                   
                   llSetLinkPrimitiveParamsFast(Prim, [PRIM_SIZE, size]);
               }
               else
               {
                   integer i = 0;
                   do
                   {
                       list params = llGetLinkPrimitiveParams(i, [PRIM_DESC]);
                       list parsed = llParseString2List(llList2CSV(params), ["#"], []);
                       string vect = llList2String(parsed, 0);
                       vector size = (vector)vect;
                       string posi = llList2String(parsed, 1);
                       vector position = (vector)posi;
                       
                       if(i > 1)
                       {
                           llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size, PRIM_POS_LOCAL, position]);
                       }
                       else
                       {
                           llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);
                       }
                   }
                   while(++i <= Links);
               }
               llOwnerSay("All stored parameters have been restored.");
               menu2();
           }
           else if(New)
           {
               llOwnerSay("Please first save all paremeters to use this.");
           }
       }
       
       // Resize
       if(shift != 0)
       {
           if(!LinkSet)
           {
               list params = llGetLinkPrimitiveParams(Prim, [PRIM_SIZE]);
               vector size = llList2Vector(params, 0) * shift;
               
               llSetLinkPrimitiveParamsFast(Prim, [PRIM_SIZE, size]);
           }
           else
           {
               integer i = 0;
               do
               {
                   list params = llGetLinkPrimitiveParams(i, [PRIM_SIZE, PRIM_POS_LOCAL]);
                   vector size = llList2Vector(params, 0) * shift;
                   vector position = llList2Vector(params, 1) * shift;
                   
                   if(i > 1)
                   {
                       llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size, PRIM_POS_LOCAL, position]);
                   }
                   else
                   {
                       llSetLinkPrimitiveParamsFast(i, [PRIM_SIZE, size]);
                   }
               }
               while(++i <= Links);
           }
           menu2();
       }
   }
   
   timer()
   {
       llSetTimerEvent(0);
       llListenRemove(Listener);
       llOwnerSay("Listener timeout, please touch again to use the menu.");
   }
   
   on_rez(integer Dae)
   {
       if(New)
       {
           llResetScript();
       }
   }

} </source>