Difference between revisions of "User:ANSI Soderstrom/Simple LSL Array (Associative)"
Jump to navigation
Jump to search
m |
|||
Line 77: | Line 77: | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// Add new KEY/VALUE to the "Array" while the KEY is non existent | // Add new KEY/VALUE to the "Array" while the KEY is non existent | ||
SOMELIST = PUT(SOMELIST,["KEY"],["VALUE"]); | SOMELIST = PUT(SOMELIST,["KEY"],["VALUE"]); | ||
Line 88: | Line 88: | ||
llSay(0,GET(SOMELIST,["TEST"])); // Output : VALUE | llSay(0,GET(SOMELIST,["TEST"])); // Output : VALUE | ||
llSay(0,GET(SOMELIST,["VALUE"])); // Output : TEST | llSay(0,GET(SOMELIST,["VALUE"])); // Output : TEST | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// Overwrite the VALUE from the given KEY if KEY is existent | // Overwrite the VALUE from the given KEY if KEY is existent | ||
SOMELIST = PUT(SOMELIST,["KEY"],["9adba1b4-a733-4a44-8275-f4a666784d8c"]); | SOMELIST = PUT(SOMELIST,["KEY"],["9adba1b4-a733-4a44-8275-f4a666784d8c"]); | ||
Line 101: | Line 101: | ||
llSay(0,GET(SOMELIST,["TEST"])); // Output : TEST | llSay(0,GET(SOMELIST,["TEST"])); // Output : TEST | ||
llSay(0,GET(SOMELIST,["VALUE"])); // Output : VALUE | llSay(0,GET(SOMELIST,["VALUE"])); // Output : VALUE | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// case sensitive KEY´s | // case sensitive KEY´s | ||
SOMELIST = PUT(SOMELIST,["AGENT"],[NULL_KEY]); | SOMELIST = PUT(SOMELIST,["AGENT"],[NULL_KEY]); | ||
SOMELIST = PUT(SOMELIST,[AGENT],[ZERO_ROTATION]); | SOMELIST = PUT(SOMELIST,[AGENT],[ZERO_ROTATION]); | ||
llSay(0,GET(SOMELIST,["agent"])); // Output : 0 | llSay(0,GET(SOMELIST,["agent"])); // Output : 0 | ||
llSay(0,GET(SOMELIST,["AGENT"])); // Output : 00000000-0000-0000-0000-000000000000 | llSay(0,GET(SOMELIST,["AGENT"])); // Output : 00000000-0000-0000-0000-000000000000 | ||
llSay(0,GET(SOMELIST,[AGENT])); // Output : <0.000000, 0.000000, 0.000000, 1.000000> | llSay(0,GET(SOMELIST,[AGENT])); // Output : <0.000000, 0.000000, 0.000000, 1.000000> | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// Let us play... | // Let us play... | ||
SOMELIST = PUT(SOMELIST,[AGENT],llGetObjectDetails(GET(SOMELIST,["KEY"]),([OBJECT_NAME]))); | SOMELIST = PUT(SOMELIST,[AGENT],llGetObjectDetails(GET(SOMELIST,["KEY"]),([OBJECT_NAME]))); | ||
Line 119: | Line 119: | ||
llSay(0,GET(SOMELIST,["KEY"])); // Output : 9adba1b4-a733-4a44-8275-f4a666784d8c | llSay(0,GET(SOMELIST,["KEY"])); // Output : 9adba1b4-a733-4a44-8275-f4a666784d8c | ||
llSay(0,GET(SOMELIST,[AGENT])); // Output : ANSI Soderstrom | llSay(0,GET(SOMELIST,[AGENT])); // Output : ANSI Soderstrom | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
Line 129: | Line 129: | ||
} | } | ||
// Output : Not in List | // Output : Not in List | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
llSay(0,llList2CSV(SOMELIST)); | llSay(0,llList2CSV(SOMELIST)); | ||
/* | /* | ||
Line 140: | Line 140: | ||
AGENT, 00000000-0000-0000-0000-000000000000 | AGENT, 00000000-0000-0000-0000-000000000000 | ||
*/ | */ | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// Extended behavior | // Extended behavior | ||
list WHITELIST; | list WHITELIST; | ||
list BLACKLIST; | list BLACKLIST; | ||
WHITELIST = [ "1234","ANSI Soderstrom", | WHITELIST = [ "1234","ANSI Soderstrom", | ||
"4321","Other Name" | "4321","Other Name" | ||
]; | ]; | ||
BLACKLIST = [ "9876","Invisible Linden", | BLACKLIST = [ "9876","Invisible Linden", | ||
"6789","Visible Linden" | "6789","Visible Linden" | ||
]; | ]; | ||
// Does NOTHING (no Target List) | // Does NOTHING (no Target List) | ||
PUT(WHITELIST,["1234"],["Any Value"]); | PUT(WHITELIST,["1234"],["Any Value"]); | ||
// Dont touch the Blacklist... | // Dont touch the Blacklist... | ||
// Overwrite Whitelist with Blacklist AND CHANGE the Value of the given Name in the Whitelist | // Overwrite Whitelist with Blacklist AND CHANGE the Value of the given Name in the Whitelist | ||
Line 164: | Line 164: | ||
WHITELIST = PUT(BLACKLIST,["9876"],["Changed Name"]); | WHITELIST = PUT(BLACKLIST,["9876"],["Changed Name"]); | ||
llOwnerSay(llList2CSV(WHITELIST)); // Whitelist : 9876, Changed Name, 6789, Visible Linden | llOwnerSay(llList2CSV(WHITELIST)); // Whitelist : 9876, Changed Name, 6789, Visible Linden | ||
// Dont touch the Blacklist... | // Dont touch the Blacklist... | ||
// Overwrite Whitelist with Blacklist AND ADD the given KEY/VALUE to Whitelist | // Overwrite Whitelist with Blacklist AND ADD the given KEY/VALUE to Whitelist | ||
Line 170: | Line 170: | ||
WHITELIST = PUT(BLACKLIST,["1234"],["Any Value"]); | WHITELIST = PUT(BLACKLIST,["1234"],["Any Value"]); | ||
llOwnerSay(llList2CSV(WHITELIST)); // Whitelist : 9876, Invisible Linden, 6789, Visible Linden, 1234, Any Value | llOwnerSay(llList2CSV(WHITELIST)); // Whitelist : 9876, Invisible Linden, 6789, Visible Linden, 1234, Any Value | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// Simple eval(); | // Simple eval(); | ||
list EVAL = [ "Key 1","Test 1", | list EVAL = [ "Key 1","Test 1", | ||
"Key 2","Test 2", | "Key 2","Test 2", | ||
"Key 3","Test 3" | "Key 3","Test 3" | ||
]; | ]; | ||
integer i = llGetListLength(EVAL)/2; | integer i = llGetListLength(EVAL)/2; | ||
for(;i;--i) { | for(;i;--i) { | ||
llSay(0,GET(EVAL,["Key " + (string)i])); | llSay(0,GET(EVAL,["Key " + (string)i])); | ||
} | } | ||
// Output: | // Output: | ||
// Test 3 | // Test 3 | ||
// Test 2 | // Test 2 | ||
// Test 1 | // Test 1 | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// more complex... (Beware of Traps...) | // more complex... (Beware of Traps...) | ||
list LIST; | list LIST; | ||
list TEST; | list TEST; | ||
Line 213: | Line 213: | ||
llSay(0,GET(TEST,["1234"])); // Output : First Value | llSay(0,GET(TEST,["1234"])); // Output : First Value | ||
llSay(0,GET(TEST,[1234])); // Output : 0 | llSay(0,GET(TEST,[1234])); // Output : 0 | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// AGENT is a static integer with the value 1 | // AGENT is a static integer with the value 1 | ||
SOMELIST = PUT(SOMELIST,[AGENT],["AGENT"]); | SOMELIST = PUT(SOMELIST,[AGENT],["AGENT"]); | ||
llSay(0,GET(SOMELIST,[1])); // Output : AGENT | llSay(0,GET(SOMELIST,[1])); // Output : AGENT | ||
llSay(0,GET(SOMELIST,[AGENT])); // Output : AGENT | llSay(0,GET(SOMELIST,[AGENT])); // Output : AGENT | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
// Remember... "AGENT" and AGENT are different, and "AGENT" is a VALUE, not a KEY !!! | // Remember... "AGENT" and AGENT are different, and "AGENT" is a VALUE, not a KEY !!! | ||
if(!(integer)GET(SOMELIST,["AGENT"])) { | if(!(integer)GET(SOMELIST,["AGENT"])) { | ||
Line 231: | Line 231: | ||
} | } | ||
// Output : Not in List | // Output : Not in List | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
llSay(0,llList2CSV(SOMELIST)); | |||
// Output : KEY, 9adba1b4-a733-4a44-8275-f4a666784d8c, | |||
// 1, AGENT, | |||
// TEST, TEST, | |||
// VALUE, VALUE, | |||
// AGENT, 00000000-0000-0000-0000-000000000000 | |||
SOMELIST = ERASE(SOMELIST,["KEY"]); | |||
llSay(0,llList2CSV(SOMELIST)); | |||
// Output : 1, AGENT, | |||
// TEST, TEST, | |||
// VALUE, VALUE, | |||
// AGENT, 00000000-0000-0000-0000-000000000000 | |||
SOMELIST = ERASE(SOMELIST,[AGENT]); | |||
llSay(0,llList2CSV(SOMELIST)); | |||
// Output : TEST, TEST, | |||
// VALUE, VALUE, | |||
// AGENT, 00000000-0000-0000-0000-000000000000 | |||
SOMELIST = ERASE(SOMELIST,["AGENT"]); | |||
llSay(0,llList2CSV(SOMELIST)); | |||
// Output : TEST, TEST, | |||
// VALUE, VALUE, | |||
SOMELIST = ERASE(SOMELIST,["VALUE"]); | |||
llSay(0,llList2CSV(SOMELIST)); | |||
// Output : TEST, TEST, | |||
SOMELIST = ERASE(SOMELIST,["TEST"]); | |||
llSay(0,llList2CSV(SOMELIST)); | |||
// Output : | |||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
/* | /* | ||
Now you can manage your Settings simple... | Now you can manage your Settings simple... | ||
list SETTINGS; | list SETTINGS; | ||
SETTINGS = PUT(SETTINGS,["owner"],[llGetOwner()]); | SETTINGS = PUT(SETTINGS,["owner"],[llGetOwner()]); | ||
SETTINGS = PUT(SETTINGS,["POS"],[llGetPos()]); | SETTINGS = PUT(SETTINGS,["POS"],[llGetPos()]); | ||
list API; | list API; | ||
API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]); | API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]); | ||
llMessageLinked(LINK_SET,(integer)GET(API,["I_HAVE_THE_SETTINGS"]),llList2CSV(SETTINGS),llGetOwner()); | llMessageLinked(LINK_SET,(integer)GET(API,["I_HAVE_THE_SETTINGS"]),llList2CSV(SETTINGS),llGetOwner()); | ||
// -------------------------------------------------------------------------------- | // -------------------------------------------------------------------------------- | ||
list SETTINGS; | list SETTINGS; | ||
list API; | list API; | ||
API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]); | API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]); | ||
link_message(integer sender_num, integer num, string str, key id) { | link_message(integer sender_num, integer num, string str, key id) { | ||
// receive a valid message for this state AND try a further Copy Protection | // receive a valid message for this state AND try a further Copy Protection | ||
Line 264: | Line 302: | ||
} // if | } // if | ||
} // link_message | } // link_message | ||
*/ | */ | ||
} | } | ||
} | } | ||
</lsl> | </lsl> |
Revision as of 23:13, 22 April 2010
Leave a comment
Simple LSL Array (Associative)
<lsl> // Simple LSL Array for your Scripts (useful but slow) // (C) 02/2010 ANSI Soderstrom
list SOMELIST;
string GET(list ARRAY,list KEY) {
if(!llGetListLength(KEY)>1) { // dont allow lists in lists return "-1"; } integer position; do { position = llListFindList(ARRAY, KEY); if(position%2 && ~position && position) { ARRAY = llDeleteSubList(ARRAY,0,position); } } while (~position && position%2); if(~position) { return llList2String(ARRAY,position+1); } else { return "0"; }
}
list PUT(list ARRAY,list KEY, list VALUE) {
if(llGetListLength(KEY)>1 || llGetListLength(VALUE)>1) { // dont allow lists in lists return [-1]; } integer position = llListFindList(ARRAY, KEY); list helparray = []; do { if(!~position) { ARRAY += KEY; ARRAY += VALUE; return helparray + ARRAY; } if(position%2 && ~position && position) { helparray += llList2List(ARRAY,0,position); ARRAY = llDeleteSubList(ARRAY,0,position); position = llListFindList(ARRAY, KEY); } } while (position%2); ARRAY = llListReplaceList(ARRAY, VALUE, position + 1, position + 1); return helparray + ARRAY;
}
list ERASE(list ARRAY,list KEY) {
integer position = llListFindList(ARRAY, KEY); list helparray = []; do { if(!~position) { return helparray + ARRAY; } if(position%2 && ~position && position) { helparray += llList2List(ARRAY,0,position); ARRAY = llDeleteSubList(ARRAY,0,position); position = llListFindList(ARRAY, KEY); } } while (position%2); ARRAY = llDeleteSubList(ARRAY,position, position + 1); return helparray + ARRAY;
} </lsl>
What do those lines do?
<lsl> default {
state_entry() { // -------------------------------------------------------------------------------- // Add new KEY/VALUE to the "Array" while the KEY is non existent SOMELIST = PUT(SOMELIST,["KEY"],["VALUE"]); SOMELIST = PUT(SOMELIST,[AGENT],[<1,1,1>]); SOMELIST = PUT(SOMELIST,["TEST"],["VALUE"]); SOMELIST = PUT(SOMELIST,["VALUE"],["TEST"]); llSay(0,GET(SOMELIST,["KEY"])); // Output : VALUE llSay(0,GET(SOMELIST,[AGENT])); // Output : <1.000000, 1.000000, 1.000000> llSay(0,GET(SOMELIST,["TEST"])); // Output : VALUE llSay(0,GET(SOMELIST,["VALUE"])); // Output : TEST // -------------------------------------------------------------------------------- // Overwrite the VALUE from the given KEY if KEY is existent SOMELIST = PUT(SOMELIST,["KEY"],["9adba1b4-a733-4a44-8275-f4a666784d8c"]); SOMELIST = PUT(SOMELIST,[AGENT],["unknown"]); SOMELIST = PUT(SOMELIST,["TEST"],["TEST"]); SOMELIST = PUT(SOMELIST,["VALUE"],["VALUE"]); llSay(0,GET(SOMELIST,["KEY"])); // Output : 9adba1b4-a733-4a44-8275-f4a666784d8c llSay(0,GET(SOMELIST,[AGENT])); // Output : unknown llSay(0,GET(SOMELIST,["TEST"])); // Output : TEST llSay(0,GET(SOMELIST,["VALUE"])); // Output : VALUE // -------------------------------------------------------------------------------- // case sensitive KEY´s SOMELIST = PUT(SOMELIST,["AGENT"],[NULL_KEY]); SOMELIST = PUT(SOMELIST,[AGENT],[ZERO_ROTATION]); llSay(0,GET(SOMELIST,["agent"])); // Output : 0 llSay(0,GET(SOMELIST,["AGENT"])); // Output : 00000000-0000-0000-0000-000000000000 llSay(0,GET(SOMELIST,[AGENT])); // Output : <0.000000, 0.000000, 0.000000, 1.000000> // -------------------------------------------------------------------------------- // Let us play... SOMELIST = PUT(SOMELIST,[AGENT],llGetObjectDetails(GET(SOMELIST,["KEY"]),([OBJECT_NAME]))); llSay(0,GET(SOMELIST,["KEY"])); // Output : 9adba1b4-a733-4a44-8275-f4a666784d8c llSay(0,GET(SOMELIST,[AGENT])); // Output : ANSI Soderstrom // -------------------------------------------------------------------------------- // ANSI Soderstrom is not a KEY, only a VALUE if(!(integer)GET(SOMELIST,["ANSI Soderstrom"])) { llSay(0,"Not in List"); } else { llSay(0,"Found"); } // Output : Not in List // -------------------------------------------------------------------------------- llSay(0,llList2CSV(SOMELIST)); /* Output : KEY, 9adba1b4-a733-4a44-8275-f4a666784d8c, 1, ANSI Soderstrom, TEST, TEST, VALUE, VALUE, AGENT, 00000000-0000-0000-0000-000000000000 */ // -------------------------------------------------------------------------------- // Extended behavior list WHITELIST; list BLACKLIST; WHITELIST = [ "1234","ANSI Soderstrom", "4321","Other Name" ]; BLACKLIST = [ "9876","Invisible Linden", "6789","Visible Linden" ]; // Does NOTHING (no Target List) PUT(WHITELIST,["1234"],["Any Value"]); // Dont touch the Blacklist... // Overwrite Whitelist with Blacklist AND CHANGE the Value of the given Name in the Whitelist // (because KEY is in Blacklist) WHITELIST = PUT(BLACKLIST,["9876"],["Changed Name"]); llOwnerSay(llList2CSV(WHITELIST)); // Whitelist : 9876, Changed Name, 6789, Visible Linden // Dont touch the Blacklist... // Overwrite Whitelist with Blacklist AND ADD the given KEY/VALUE to Whitelist // (because KEY is not in Blacklist) WHITELIST = PUT(BLACKLIST,["1234"],["Any Value"]); llOwnerSay(llList2CSV(WHITELIST)); // Whitelist : 9876, Invisible Linden, 6789, Visible Linden, 1234, Any Value // -------------------------------------------------------------------------------- // Simple eval(); list EVAL = [ "Key 1","Test 1", "Key 2","Test 2", "Key 3","Test 3" ]; integer i = llGetListLength(EVAL)/2; for(;i;--i) { llSay(0,GET(EVAL,["Key " + (string)i])); } // Output: // Test 3 // Test 2 // Test 1 // -------------------------------------------------------------------------------- // more complex... (Beware of Traps...) list LIST; list TEST; string test; LIST = PUT(LIST,["1234"],["First Value"]); LIST = PUT(LIST,[1234],["Second Value"]); test = llList2CSV(LIST); llSay(0,test); // Output : 1234, First Value, 1234, Second Value llSay(0,GET(LIST,["1234"])); // Output : First Value llSay(0,GET(LIST,[1234])); // Output : Second Value TEST = llCSV2List(test); llSay(0,llList2CSV(TEST)); // Output : 1234, First Value, 1234, Second Value // ARRAY BROKEN AFTER llList2CSV(); !!! llSay(0,GET(TEST,["1234"])); // Output : First Value llSay(0,GET(TEST,[1234])); // Output : 0 // -------------------------------------------------------------------------------- // AGENT is a static integer with the value 1 SOMELIST = PUT(SOMELIST,[AGENT],["AGENT"]); llSay(0,GET(SOMELIST,[1])); // Output : AGENT llSay(0,GET(SOMELIST,[AGENT])); // Output : AGENT // -------------------------------------------------------------------------------- // Remember... "AGENT" and AGENT are different, and "AGENT" is a VALUE, not a KEY !!! if(!(integer)GET(SOMELIST,["AGENT"])) { llSay(0,"Not in List"); } else { llSay(0,"Found"); } // Output : Not in List // -------------------------------------------------------------------------------- llSay(0,llList2CSV(SOMELIST)); // Output : KEY, 9adba1b4-a733-4a44-8275-f4a666784d8c, // 1, AGENT, // TEST, TEST, // VALUE, VALUE, // AGENT, 00000000-0000-0000-0000-000000000000 SOMELIST = ERASE(SOMELIST,["KEY"]); llSay(0,llList2CSV(SOMELIST)); // Output : 1, AGENT, // TEST, TEST, // VALUE, VALUE, // AGENT, 00000000-0000-0000-0000-000000000000 SOMELIST = ERASE(SOMELIST,[AGENT]); llSay(0,llList2CSV(SOMELIST)); // Output : TEST, TEST, // VALUE, VALUE, // AGENT, 00000000-0000-0000-0000-000000000000 SOMELIST = ERASE(SOMELIST,["AGENT"]); llSay(0,llList2CSV(SOMELIST)); // Output : TEST, TEST, // VALUE, VALUE, SOMELIST = ERASE(SOMELIST,["VALUE"]); llSay(0,llList2CSV(SOMELIST)); // Output : TEST, TEST, SOMELIST = ERASE(SOMELIST,["TEST"]);
llSay(0,llList2CSV(SOMELIST)); // Output : // -------------------------------------------------------------------------------- /* Now you can manage your Settings simple... list SETTINGS; SETTINGS = PUT(SETTINGS,["owner"],[llGetOwner()]); SETTINGS = PUT(SETTINGS,["POS"],[llGetPos()]); list API; API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]); llMessageLinked(LINK_SET,(integer)GET(API,["I_HAVE_THE_SETTINGS"]),llList2CSV(SETTINGS),llGetOwner()); // -------------------------------------------------------------------------------- list SETTINGS; list API; API = PUT(API,["I_HAVE_THE_SETTINGS"],[-34234242]); link_message(integer sender_num, integer num, string str, key id) { // receive a valid message for this state AND try a further Copy Protection if(id==llGetCreator() && num==(integer)GET(API,["I_HAVE_THE_SETTINGS"]) { SETTINGS = llCSV2List(str); } // if } // link_message */ }
}
</lsl>