Json multi sit array
Introduction
With the new Json support, we can now have forms of arrays instead of single line lists. For this example I have written a Json Object based array for storing keys and positions of sitting avatars on a child prim. This object allows you to sit multiple avatars on a child prim however, it won't work on an object like a vehicle that requires a root key to drive the object. For that I'd recommend using llLinkSitTarget from the root and assigning an offset to the passenger seats.
Usage
To use this script just create a new script in the child prim that will be used as the primary seat for people and drop the code from below into it. This script will keep track of what avatar is sitting where and will assign an avatar to the next empty seat accordingly.
The Code
This script utilizes the new Json array object to store multiple keys to arrays with its position offset and twist on the z axis. It is for demonstration purposes and can be used in whatever product you want :) please share this page for learning and enjoy.
//multi sit prim using Json Arrays (expects 6 seats)
//written by To-mos Codewarrior(tomos.halsey)
string SEATS_data;
list getFreeSeat()
{
string avi;integer i=llGetNumberOfPrims();
list avatarCheck;list sittingAvis;
integer listIndex;string newAvi;
integer newAviFlag=FALSE;
//get current avatars on seat
for (;i--;)
{
if(llGetAgentSize(llGetLinkKey(i+1)) != ZERO_VECTOR)
{avatarCheck += [llGetLinkKey(i+1)];}
}
//llOwnerSay("Current Avatars: "+llList2CSV(avatarCheck));
//run garbage cleaning loop to dump dead keys
//and store the existing ones for checking
for(i=6;i--;)
{
avi=llJsonGetValue(SEATS_data,["seat"+(string)i,"key"]);
if(avi!="empty")
{//if avi isn't on the list set it to empty
listIndex=llListFindList(avatarCheck,[(key)avi]);
if(!~listIndex)
SEATS_data=llJsonSetValue(SEATS_data,["seat"+(string)i,"key"],"empty");
else
sittingAvis+=avi;
}
}
//identify the new key
i=llGetListLength(avatarCheck);
for(;i--;)
{
listIndex=llListFindList(sittingAvis,[llList2String(avatarCheck,i)]);
if((!~listIndex)&&!newAviFlag)
{
newAviFlag=TRUE;
newAvi=llList2String(avatarCheck,i);
//llOwnerSay("The new avatar is: "+newAvi);
}
}
//check their numbers
if(llGetListLength(avatarCheck)>6)
{
if(newAvi!="")
llSay(0,"Too many avatars are on me, please get off "+llKey2Name(newAvi));
else
llSay(0,"More avatars need to get off me.");
return ["full"];
}
//no need to go further after cleaning
//up the array and have empty newAvi
if(newAvi=="")return ["none"];
//llOwnerSay("New avatar is: "+(string)newAvi);
//now find first instance of empty to dump the new key
//reset the new avi flag for the next loop
newAviFlag=FALSE;
for(i=6;i--;)
{
avi=llJsonGetValue(SEATS_data,["seat"+(string)i,"key"]);
if(avi=="empty"&&!newAviFlag)
{
SEATS_data=llJsonSetValue(SEATS_data,["seat"+(string)i,"key"],(string)newAvi);
//just use avatarCheck list as a temp variable for the output
avatarCheck=[llJsonGetValue(SEATS_data,["seat"+(string)i,"pos"]),llJsonGetValue(SEATS_data,["seat"+(string)i,"twist"])];
newAviFlag=TRUE;
}
}
return avatarCheck;
}
default
{
state_entry()
{
SEATS_data=llList2Json(JSON_OBJECT,
[
"seat0",llList2Json(JSON_OBJECT,["key","empty","pos",<0.734989, -1.202856, -0.018962>,"twist",-1.5706]), //frontR
"seat1",llList2Json(JSON_OBJECT,["key","empty","pos",<0.045105, -1.354009, -0.018962>,"twist",-1.5706]), //middleR
"seat2",llList2Json(JSON_OBJECT,["key","empty","pos",<-0.658836, -1.420682, -0.018962>,"twist",-1.5706]),//backR
"seat3",llList2Json(JSON_OBJECT,["key","empty","pos",<0.734989, 1.202856, -0.018962>,"twist",1.5706]), //frontL
"seat4",llList2Json(JSON_OBJECT,["key","empty","pos",<0.045105, 1.354009, -0.018962>,"twist",1.5706]), //middleL
"seat5",llList2Json(JSON_OBJECT,["key","empty","pos",<-0.658836, 1.420682, -0.018962>,"twist",1.5706]) //backL
]);
llSetClickAction(CLICK_ACTION_SIT);
llSitTarget(<0.0,0.0,0.1>,ZERO_ROTATION);
}
changed(integer change)
{
if(change & CHANGED_LINK)
{
list output=getFreeSeat();
if(output!=["full"]&&output!=["none"])
llSetLinkPrimitiveParamsFast(llGetNumberOfPrims(),[PRIM_POS_LOCAL,(vector)llList2String(output,0),PRIM_ROT_LOCAL,llEuler2Rot(<0.0,0.0,llList2Float(output,1)>)]);
//Debug draw array
//llOwnerSay(SEATS_data);
}
}
}