Open Prim Animator/Notecard Import
Jump to navigation
Jump to search
<lsl> string notecard = "Open Prim Animator: Import"; key _notecard; string contents; list _contents; list multithread_fetch = []; key nlq; key import = "6b78fcc8-e147-4105-99a6-ff19b4bf559d"; key export = "7c2ca168-2b64-4836-8727-8e62b78dbd44"; key op_alter_rootScale = "f9d3389e-a78c-43f8-9e35-c11adec112a5"; key op_adjust_link_order_by_names = "e907917f-e5a3-490e-aaac-4596a0dc176d";
list names; list pos; list rot; list size; vector rootScale;
export_string(string _export_string){
integer s=1000; while(llStringLength(_export_string) > s){ llOwnerSay(llGetSubString(_export_string,0,(s-1))); _export_string = llGetSubString(_export_string,s,-1); } if(llStringLength(_export_string) > 0){ llOwnerSay(_export_string); }
}
default{
state_entry(){ if(llGetInventoryType(notecard) == INVENTORY_NOTECARD){ _notecard = llGetInventoryKey(notecard); state num_lines; } }
changed(integer c){ if(c & CHANGED_INVENTORY){ llResetScript(); } }
}
state num_lines{
state_entry(){ nlq = llGetNumberOfNotecardLines(notecard); }
dataserver(key q, string m){ if(q == nlq){ integer i; integer j = (integer)m; list k = []; // declaring list k = []; isn't exactly necessary, you could do list k; list l = []; for(i=0;i<j;++i){ // since we don't have the concept of transactions in LSL scripts, we're going to build up these lists separately k += [NULL_KEY]; l += [NULL_KEY]; } _contents = k; // this is where we do the atomic writes due to lack of transactions on variables multithread_fetch = l; // this is where we do the atomic writes due to lack of transactions on variables k = []; // cleaning up the local variable on purpose in case the LSL VM executing this script is inefficient l = []; // cleaning up the local variable on purpose in case the LSL VM executing this script is inefficient state mtf; } }
}
state mtf{
state_entry(){ integer i; integer j=llGetListLength(multithread_fetch); for(i=0;i<j;++i){ multithread_fetch = llListReplaceList(multithread_fetch,[llGetNotecardLine(notecard,i)],i,i); // sets the notecard fetching away } }
dataserver(key q, string m){ integer i = llListFindList(multithread_fetch,[q]); if(i >= 0){ _contents = llListReplaceList(_contents,[m],i,i); // the traditional method of notecard fetching in LSL is single-threaded, getting one line at a time } if(llListFindList(_contents,[NULL_KEY]) == -1){ // since we started out with a NULLL_KEY-filled list, if there aren't any NUL_KEY in the list then we know it's done. caveat scriptor: since key and string types are interchangeable contents = llDumpList2String(_contents,""); state done_reading; } }
state_exit(){ _contents = []; multithread_fetch = []; }
}
state done_reading{
state_entry(){ integer rs_pos = llSubStringIndex(contents,"rootscale:"); integer names_pos = llSubStringIndex(contents,"names:"); integer pos_pos = llSubStringIndex(contents,"pos:"); integer rot_pos = llSubStringIndex(contents,"rot:"); integer size_pos = llSubStringIndex(contents,"size:");
rootScale = (vector)llGetSubString(contents, rs_pos + 10, names_pos - 1); names = llParseString2List(llGetSubString(contents,names_pos + 6,pos_pos - 1),["|"],[]); pos = llParseString2List(llGetSubString(contents,pos_pos + 4,rot_pos - 1),["|"],[]); rot = llParseString2List(llGetSubString(contents,rot_pos + 4,size_pos - 1),["|"],[]); size = llParseString2List(llGetSubString(contents,size_pos + 5,-1),["|"],[]);
contents = ""; // clearing memory up, we don't need the string in memory now. integer a = llGetListLength(names); integer b = llGetListLength(pos); if(b % a || llGetListLength(rot) % a || llGetListLength(size) % a){ llOwnerSay("List Lengths do not match, possible corrupted notecard (" + llList2CSV([a,llGetListLength(pos),llGetListLength(rot),llGetListLength(size)]) + ")"); }else{ llMessageLinked(LINK_THIS,b,"XDimportLength",NULL_KEY); llOwnerSay("Do import now"); } }
changed(integer c){ if(c & CHANGED_INVENTORY && llGetInventoryKey(notecard) != _notecard){ llResetScript(); } }
link_message(integer s, integer n, string m, key k){ if(m == "XDimportLength" && n == -1){ integer i; integer j=llGetListLength(pos); integer l; integer namesLength=llGetListLength(names); for(i=0;i<j;++i){ l = llListFindList(names, [llGetLinkName(2 + (i % namesLength))]) + (llFloor(i / namesLength) * namesLength); // this is to fix any bugs caused by link order changes llMessageLinked(s,i,llDumpList2String([llList2Vector(pos,l),llList2Rot(rot,l),llList2Vector(size,l)],"|"),import); } llMessageLinked(s,0,(string)rootScale, op_alter_rootScale); llOwnerSay("Done importing"); } }
touch_start(integer t){ llMessageLinked(LINK_THIS,0,"XDmenu",NULL_KEY); }
} </lsl>