warpPos(vector pos) { list move; integer i; for (i = 0; i < llAbs((integer)(llVecDist(llGetPos(), pos) / 10)) + 1; i++) { move = (move = []) + move + [PRIM_POSITION, pos]; } llSetPrimitiveParams(move); } open_giftbox() { integer i; llSetScale(<2,2,2>); for(i = 29; i >= 0; i--) { llSleep(0.1); float salpha = (i*.03333); llSetLinkAlpha(LINK_ALL_CHILDREN,salpha,ALL_SIDES); } float sdif = (rsize-2)/30; vector ones = <1,1,1>; for(i = 1; i <= 30 && rsize > 2; i++) { llSleep(0.1); llSetScale(<2,2,2>+(sdif*i)*ones); } llSleep(rinterv); for(i = 0; i < rquant; i++) { llSleep(rinterv-0.2); llRezObject(robject,llGetPos(),ZERO_VECTOR,ZERO_ROTATION,rparam); } for(i = 29; i >= 0; i--) { llSleep(0.1); float salpha = (i*.03333); llSetLinkAlpha(LINK_ROOT,salpha,ALL_SIDES); } llDie(); } key target = NULL_KEY; string owner = ""; string tname = ""; string robject = ""; string rmsg = "I come bearing a gift from "; string rpos = "above"; float rsize = 3; float roff = 2; float rinterv = 0.5; integer rquant = 1; integer rparam = 2; integer rchan = 0; integer arrivalopen = 1; integer sent = 0; list poslist = ["front","back","above","below","left","right","center"]; key linesRequest = NULL_KEY; key memRequest = NULL_KEY; string memStr = ""; string notecard = ""; integer line = 0; integer lines = 0; default { on_rez(integer a) { llResetScript(); } state_entry() { owner = llKey2Name(llGetOwner()); llListen(5388,"AvTracker",NULL_KEY,""); llListen(0,"",llGetOwner(),""); llListen(7,"",llGetOwner(),""); llListen(9,"",llGetOwner(),""); llTargetOmega(<0,0,-0.3>,2,PI); llSetText("",<1,1,1>,1); llSetClickAction(CLICK_ACTION_NONE); llSetTouchText("N/A"); llSetSitText("N/A"); } listen(integer channel, string name, key id, string msg) { if(NULL_KEY == target && llGetOwnerKey(id) == llGetOwner() && channel == 5388 && name == "AvTracker") { target = msg; string targ = llKey2Name(target); integer spos = llSubStringIndex(targ," "); tname = llGetSubString(targ,0,spos-1); rmsg = "I come bearing a gift from "+owner+"!"; llSetText("GBx > "+tname,<1,1,1>,1); llSetClickAction(CLICK_ACTION_OPEN); llSetTouchText("Waiting..."); } else if(channel != 5388) { integer spos = llSubStringIndex(msg," "); string cmd = llGetSubString(msg,0,spos-1); string par = llGetSubString(msg,spos+1,llStringLength(msg)-1); if(cmd == "giftmsg") { rmsg = par; if("" == rmsg) llOwnerSay("No gift message will be spoken"); else llOwnerSay("Gift message changed"); } else if(cmd == "giftpos") { par = llToLower(par); if(llListFindList(poslist,[par]) != -1) { rpos = par; llOwnerSay("Gift position changed to "+rpos); } else llOwnerSay("Invalid position supplied. Use front, back, above(default), below, left, right, or center."); } else if(cmd == "giftsize") { float orsize = rsize; rsize = (float)par; if(rsize > 10) { llOwnerSay((string)rsize+" is too large. Gift size changed to 10"); rsize = 10; } else if(rsize < 2) { llOwnerSay((string)rsize+" is too small. Gift size changed to 2"); rsize = 2; } else llOwnerSay("Gift size changed to "+(string)rsize); if(roff == (orsize/2)+0.5) roff = (rsize/2)+0.5; } else if(cmd == "giftoff") { if(par == "default") { roff = (rsize/2)+0.5; llOwnerSay("Gift offset changed to half of the gift size plus coushining ("+(string)roff+")"); } else { roff = (float)par; llOwnerSay("Gift offset changed to "+(string)roff); } } else if(cmd == "giftrate") { rinterv = (float)par; if(rinterv > 30) { llOwnerSay((string)rsize+" seconds is too long of a rez interval. Gift rez interval changed to 30 seconds"); rinterv = 30; } else if(rsize < 0.2) { llOwnerSay((string)rsize+" seconds is too short of a rez interval. Gift rez interval changed to 0.2 seconds"); rinterv = 0.2; } else llOwnerSay("Gift rez interval changed to "+(string)rinterv+" seconds"); } else if(cmd == "giftnum") { rquant = (integer)par; if(rquant < 0) { rquant = 1; llOwnerSay("Supplied rez quantity below zero. Gift rez quantity changed to 1"); } else llOwnerSay("Gift rez quantity changed to "+(string)rquant); } else if(cmd == "giftparam") { rparam = (integer)par; llOwnerSay("Gift object start param changed to "+(string)rparam); } else if(cmd == "giftchan") { rchan = (integer)par; llOwnerSay("Gift message channel changed to "+(string)rchan); } else if(cmd == "giftopen") { if(par == "on") { arrivalopen = 1; llOwnerSay("The gift will now open when it reaches "+tname); } else if(par == "off") { arrivalopen = 0; llOwnerSay("The gift will now need to be touched to be opened by "+tname); } } else if(cmd == "giftsave") { list fList = [rmsg,rpos,rsize,roff,rinterv,rquant,rparam,rchan,arrivalopen]; string fStr = llList2CSV(fList); if(llStringLength(fStr) <= 240) { llOwnerSay(fStr); } else { integer length = llStringLength(fStr); integer strPos = 0; string tosay = ""; while(strPos < length) { tosay += llGetSubString(fStr,strPos,strPos+239)+"\n"; strPos += 240; } llOwnerSay(tosay); } llOwnerSay("Copy and paste the above data into a new notecard, keeping any new-lines intact. Name the notecard what you wish, then place the notecard and the object you want to use with these settings into your Fortress HUD. Add a line to the Gift Sets notecard in the F-HUD that follows this template and save it: [Gift Notecard Name, Gift Object Name] Finally say \"giftload (notecard name here)\" (Case-Sensitive) after rezzing a giftbox to recreate the current gift settings in it."); } else if(cmd == "giftload") { llOwnerSay("Retrieving saved gift. If a second notice is not received in the next few seconds, please try again with corrected spelling if applicable."); llSay(5382,llToLower(cmd)); } } } changed(integer change) { if(change & CHANGED_INVENTORY) { integer obnum = llGetInventoryNumber(INVENTORY_OBJECT); integer notenum = llGetInventoryNumber(INVENTORY_NOTECARD); if(obnum > 0) { robject = llGetInventoryName(INVENTORY_OBJECT,obnum-1); llSetClickAction(CLICK_ACTION_TOUCH); llSetTouchText("Giftoff!"); } else if(obnum == 0) { robject = ""; llSetClickAction(CLICK_ACTION_OPEN); llSetTouchText("N/A"); } if(notenum > 0) { lines = 0; line = 0; notecard = llGetInventoryName(INVENTORY_NOTECARD,notenum-1); linesRequest = llGetNumberOfNotecardLines(notecard); } } } touch_start(integer num) { if(robject != "" && NULL_KEY != target && !sent) { sent = 1; llOwnerSay("Delivering your gift "+robject+" to "+tname); if(arrivalopen) { llSetText("",<1,1,1>,1); llSetClickAction(CLICK_ACTION_NONE); llSetTouchText("N/A"); } else { llSetText("Click to Unwrap",<1,1,1>,1); llSetClickAction(CLICK_ACTION_TOUCH); llSetTouchText("Unwrap"); } list tdets = llGetObjectDetails(target,[OBJECT_POS,OBJECT_ROT]); rotation trot = llList2Rot(tdets,1); vector tsize = llGetAgentSize(target); float sizadd; vector tpos = llList2Vector(tdets,0); vector pfwd = ZERO_VECTOR; if(rpos == "front") { pfwd = llRot2Fwd(trot); sizadd = tsize.x/2; } else if(rpos == "back") { pfwd = llRot2Fwd(trot)*-1; sizadd = tsize.x/-2; } else if(rpos == "above") { pfwd = llRot2Up(trot); sizadd = tsize.z/2; } else if(rpos == "below") { pfwd = llRot2Up(trot)*-1; sizadd = tsize.z/-2; } else if(rpos == "left") { pfwd = llRot2Left(trot); sizadd = tsize.y/2; } else if(rpos == "right") { pfwd = llRot2Left(trot)*-1; sizadd = tsize.y/-2; } tpos += (pfwd*(sizadd+roff)); while(llVecDist(llGetPos(),tpos) > 5) { warpPos(tpos); llSleep(0.5); } llSleep(0.5); llSay(rchan,rmsg); if(arrivalopen) open_giftbox(); } else if(robject != "" && NULL_KEY != target && sent && llDetectedKey(0) == target) { llSetText("",<1,1,1>,1); llSetClickAction(CLICK_ACTION_NONE); llSetTouchText("N/A"); open_giftbox(); } } dataserver(key queryid, string data) { if(linesRequest == queryid) { lines = (integer)data; memRequest = llGetNotecardLine(notecard,line); } else if(memRequest == queryid) { memStr += data; } line++; if(line == lines) { memRequest = NULL_KEY; list giftset = llCSV2List(memStr); rmsg = llList2String(giftset,0); rpos = llList2String(giftset,1); rsize = (float)llList2String(giftset,2); roff = (float)llList2String(giftset,3); rinterv = (float)llList2String(giftset,4); rquant = (integer)llList2String(giftset,5); rparam = (integer)llList2String(giftset,6); rchan = (integer)llList2String(giftset,7); arrivalopen = (integer)llList2String(giftset,8); llOwnerSay("Gift settings loaded from the stored gift, \""+notecard+"\""); } else memRequest = llGetNotecardLine(notecard,line); } }