User:ANSI Soderstrom/Simple LSL Array (Associative): Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
mNo edit summary |
||
| Line 229: | Line 229: | ||
} | } | ||
</lsl> | </lsl> | ||
== Leave a comment == | |||
* [[User_talk:{{PAGENAME}}|My User Talk about this Page]] | |||
Revision as of 04:47, 8 April 2010
<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;
} </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
// --------------------------------------------------------------------------------
// 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
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
/*
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>