//Touched Prim Link Nums integer X_POS = 7; integer X_NEG = 3; integer Y_POS = 6; integer Y_NEG = 5; integer Z_POS = 8; integer Z_NEG = 2; integer BLOCK_TYPE = 4; integer totalBlocks = 1; list blocks = [ //B# 0 "Jebediah Block", "Blue Plasma", <1,1,0> ]; integer block = 0; string obj = "Jebediah Block"; vector memPos = <0,0,0>; integer memMode = 0; string notecard; integer lines; integer line; list memList = []; key memRequest = NULL_KEY; key linesRequest = NULL_KEY; //The memList has numbered directions. //They are as follows: //0 = Move x+ //1 = Move x- //2 = Move y+ //3 = Move y- //4 = Move z+ //5 = Move z- //6 = Set block to none //7^ = Set block type (7 + block number) default { on_rez(integer a) { llSetPos(llGetPos()+<0,0,2>); llResetScript(); } state_entry() { llListen(0,"",llGetOwner(),""); string texture = llList2String(blocks,(block*3)+1); vector color = llList2Vector(blocks,(block*3)+2); llSetLinkTexture(BLOCK_TYPE,texture,ALL_SIDES); llSetLinkColor(BLOCK_TYPE,color,ALL_SIDES); llSetLinkAlpha(BLOCK_TYPE,0.4,ALL_SIDES); } listen(integer channel, string name, key id, string msg) { if(msg == "save pos") { llSay(0,"Current position saved. Say 'return pos' to return here."); memPos = llGetPos(); } else if(msg == "return pos") { llSetPos(memPos); } else if(msg == "begin memory") { llSay(0,"Memorization activated. All moves from this point will be stored in memory. Say 'end memory' to stop."); memList = []; memMode = 1; } else if(msg == "continue memory") { llSay(0,"Memorization resumed. Adding onto last loaded/memorized data. Say 'end memory' to stop."); memMode = 1; } else if(msg == "end memory") { llSay(0,"Memorization ended. Say 'memory file' to retrieve the data."); memMode = 0; } else if(msg == "memory file") { if(llGetListLength(memList) <= 80) { llOwnerSay(llList2CSV(memList)); } else { integer length = llGetListLength(memList); integer listPos = 0; while(listPos < length) { llOwnerSay(llList2CSV(llList2List(memList,listPos,listPos+79))); listPos += 80; } } llOwnerSay("Copy and paste the above data into a new notecard, each post on a new line. Name the notecard what you wish, then place the notecard into your Rezzer. Say 'rebuild (notecard name here)' (Case-Sensitive) to recreate the memorized structure."); } else if(llGetSubString(msg,0,7) == "rebuild ") { notecard = llGetSubString(msg,8,llStringLength(msg)); lines = 0; line = 0; linesRequest = llGetNumberOfNotecardLines(notecard); llSay(0,"Attempting to rebuild from notecard: " + notecard + "..."); } } touch_start(integer num) { if(llDetectedKey(0) == llGetOwner() && NULL_KEY == memRequest) { integer link = llDetectedLinkNumber(0); vector pos = llGetPos(); obj = llList2String(blocks,block*3); //llSay(0,"Link # " + (string)link); if(link == X_POS) { if(memMode) memList += [0]; if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos+<0.8,0,0>); } else if(link == X_NEG) { if(memMode) memList += [1]; if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos-<0.8,0,0>); } else if(link == Y_POS) { if(memMode) memList += [2]; if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos+<0,0.8,0>); } else if(link == Y_NEG) { if(memMode) memList += [3]; if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos-<0,0.8,0>); } else if(link == Z_POS) { if(memMode) memList += [4]; if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos+<0,0,0.8>); } else if(link == Z_NEG) { if(memMode) memList += [5]; if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos-<0,0,0.8>); } else if(link == BLOCK_TYPE) { block += 1; if(block > totalBlocks) block = 0; if(block < totalBlocks) { if(memMode) memList += [7+block]; string texture = llList2String(blocks,(block*3)+1); vector color = llList2Vector(blocks,(block*3)+2); llSetLinkTexture(BLOCK_TYPE,texture,ALL_SIDES); llSetLinkColor(BLOCK_TYPE,color,ALL_SIDES); llSetLinkAlpha(BLOCK_TYPE,0.4,ALL_SIDES); } else { if(memMode) memList += [6]; llSetLinkAlpha(BLOCK_TYPE,0,ALL_SIDES); } } } } dataserver(key queryid, string data) { if(linesRequest == queryid) { lines = (integer)data; llSay(0,"Notecard data retrieved! Beginning rebuild."); memRequest = llGetNotecardLine(notecard,line); } else if(memRequest == queryid) { memList = llCSV2List(data); integer i = 0; for(i = 0; i < llGetListLength(memList); i++) { integer cmd = llList2Integer(memList,i); vector pos = llGetPos(); obj = llList2String(blocks,block*3); if(cmd == 0) { if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos+<0.8,0,0>); } else if(cmd == 1) { if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos-<0.8,0,0>); } else if(cmd == 2) { if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos+<0,0.8,0>); } else if(cmd == 3) { if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos-<0,0.8,0>); } else if(cmd == 4) { if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos+<0,0,0.8>); } else if(cmd == 5) { if(block < totalBlocks) llRezObject(obj,pos,ZERO_VECTOR,ZERO_ROTATION,2); llSetPos(pos-<0,0,0.8>); } else if(cmd == 6) { block = totalBlocks; llSetLinkAlpha(BLOCK_TYPE,0,ALL_SIDES); } else if(cmd >= 7) { block = cmd - 7; string texture = llList2String(blocks,(block*3)+1); vector color = llList2Vector(blocks,(block*3)+2); llSetLinkTexture(BLOCK_TYPE,texture,ALL_SIDES); llSetLinkColor(BLOCK_TYPE,color,ALL_SIDES); llSetLinkAlpha(BLOCK_TYPE,0.4,ALL_SIDES); } } line++; if(line == lines) { llSay(0,"Finished rebuilding."); memRequest = NULL_KEY; } else memRequest = llGetNotecardLine(notecard,line); } } }