key kOwner; integer iLinkAmount; integer iScriptAmount=1; integer iScriptID=1; integer iTemp; integer iTemp2; integer iListener; integer iCurrentSize=100; integer iFlags; // 1 - setup done, 2 - setting up, 4 - resizing, 8 - listening, 16 - added string sScript; list lTemp; list lButtons=["Delete","Reset","Size","Custom","+25","-25","+10","-10","+5","-5","+1","-1"]; vector vTemp; setFlag(integer flag) { if(!(iFlags & flag)) iFlags+=flag; } unsetFlag(integer flag) { if(iFlags & flag) iFlags-=flag; } doResize(integer percentage) { setFlag(4); if(iScriptID==1) llMessageLinked(LINK_THIS,12121,(string)percentage,NULL_KEY); vTemp=llGetPos(); ; if(!(iTemp2=((iTemp=(llCeil((float)iLinkAmount / (float)iScriptAmount))*iScriptID)) - llCeil((float)iLinkAmount / (float)iScriptAmount))) iTemp2=1; if(percentage != 0) { iCurrentSize=percentage+iCurrentSize; if(iScriptID==1) llOwnerSay("Resizing to: "+(string)iCurrentSize+"% ("+(string)percentage+"%)"); } else { iCurrentSize=100; if(iScriptID==1) llOwnerSay("Resetting size."); } do { llSetLinkPrimitiveParams(iTemp,[PRIM_POSITION,(((vector)llList2String(lTemp=llParseString2List(llList2String(llGetObjectDetails(llGetLinkKey(iTemp),[OBJECT_DESC]),0),["#"],[""]),1))/100)*iCurrentSize,PRIM_SIZE,((((vector)llList2String(lTemp,0))/100)*iCurrentSize)]); } while((iTemp=~-iTemp) != iTemp2); if(iTemp2==1) { llSetScale((((vector)llList2String(llParseString2List(llList2String(llGetObjectDetails(llGetLinkKey(iTemp),[OBJECT_DESC]),0),["#"],[""]),0))/100)*iCurrentSize); if(!percentage) llOwnerSay("Resize operation finished. Object resized to original scale."); else llOwnerSay("Resize operation finished. Object resized to "+(string)(iCurrentSize)+"%"); } unsetFlag(4); } default { state_entry() { if((iLinkAmount=llGetObjectPrimCount(llGetKey())) > 1) { if(llGetLinkNumber() > 1) { llSetObjectDesc((string)llGetScale()+"#"+(string)llGetLocalPos()); llMessageLinked(LINK_ROOT,45454,"",NULL_KEY); llRemoveInventory(llGetScriptName()); } else { llMessageLinked(LINK_THIS,34343,"",NULL_KEY); llOwnerSay("Please wait..."); llSetTimerEvent(2); kOwner=llGetOwner(); sScript=llGetScriptName(); } } } on_rez(integer foo) { if(kOwner!=llGetOwner()) kOwner=llGetOwner(); } changed(integer change) { if(change & CHANGED_OWNER) kOwner=llGetOwner(); else if(change & CHANGED_LINK) { if(iScriptID!=1) llRemoveInventory(sScript); else if(iFlags) { llOwnerSay("Changed link configuration. Resetting myself."); llResetScript(); } } } touch_start(integer foo) { if(iScriptID==1) { if(iFlags & 8) { llSetTimerEvent(0); llListenRemove(iListener); unsetFlag(8); } if(iFlags & 1) { setFlag(8); iListener=llListen(iTemp=llFloor(llFrand(2137483647)+10000000),"",kOwner,""); llDialog(kOwner,"Choose:",lButtons,iTemp); llSetTimerEvent(10); } } } link_message(integer sender, integer num, string str,key id) { if(num==34343 && iFlags) { ++iScriptAmount; llMessageLinked(LINK_THIS,23232,"",NULL_KEY); } if(num==12121 && !(iFlags & 4) && iScriptID!=1) doResize((integer)str); else if(num == 23232 && !(iFlags & 16)) { if((iScriptID=-~iScriptID) >4) { llOwnerSay("There are already 4 resize scripts in the object. Deleting myself."); llMessageLinked(LINK_THIS,78787,"",NULL_KEY); llRemoveInventory(sScript); } else llSetTimerEvent(2); } else if((num==45454) && (iScriptID == 1)) { if(iFlags & 2) if((iTemp=-~iTemp)==(iLinkAmount-1)) { setFlag(1); llOwnerSay("The resizer is set up and ready to use. The current object will take approximately "+(string)(iLinkAmount*0.2)+" seconds to resize."); llOwnerSay("Add more copies of this script to the object to speed up the operation. Touch the object to get a menu."); } } else if(num==67676) llRemoveInventory(sScript); else if(num==78787) iScriptAmount=~-iScriptAmount; } listen(integer channel,string name, key id, string message) { if(iFlags & 8) { if(iTemp==1) { llSetTimerEvent(0); llListenRemove(iListener); doResize((integer)message); } else if((iTemp=llListFindList(lButtons,[message])) != -1) { llSetTimerEvent(0); llListenRemove(iListener); if(!iTemp) { llOwnerSay("Deleting resizer."); llMessageLinked(LINK_THIS,67676,"",NULL_KEY); llRemoveInventory(sScript); } else if(iTemp==1) doResize(0); else if(iTemp==2) llOwnerSay("Current size is: "+(string)iCurrentSize+"%"); else if(iTemp==3) { llOwnerSay("Say your custom size offset in percent on channel 1."); iListener=llListen(iTemp=1,"",kOwner,""); } else doResize((integer)message); } } } timer() { llSetTimerEvent(0); if(!iFlags) { if(iScriptID == 1) { setFlag(2); setFlag(16); llOwnerSay("Spreading temporary scripts in object's prims. Please wait til the process finishes..."); iTemp=iLinkAmount; do llGiveInventory(llGetLinkKey(iTemp),sScript); while(iTemp=~-iTemp); llSetObjectDesc((string)llGetScale()+"#"+(string)llGetLocalPos()); llOwnerSay("Scripts spread. Please take this object into inventory, rez or wear it again, and select 'tools -> set all scripts to running in selection'"); } else { setFlag(16); llOwnerSay((string)(iScriptAmount=iScriptID)+" resize scripts inserted. It will take approximately "+(string)((iLinkAmount * 0.2) / iScriptID)+" seconds to resize the object now."); } } else { llListenRemove(iListener); setFlag(1); llOwnerSay("Menu timed out."); } } }