list Positions = ["<0.73953, 0.84836, 0.54750>;<0.00000, 0.00000, -0.70711, 0.70711>",
"<-0.01971, 0.84836, 0.54750>;<0.00000, 0.00000, -0.70711, 0.70711>",
"<-0.72160, 0.84836, 0.54750>;<0.00000, 0.00000, -0.70711, 0.70711>",
"<-0.72160, -0.87112, 0.54750>;<0.00000, 0.00000, 0.70711, 0.70711>",
"<-0.00023, -0.87112, 0.54750>;<0.00000, 0.00000, 0.70711, 0.70711>",
"<0.73091, -0.87112, 0.54750>;<0.00000, 0.00000, 0.70711, 0.70711>"];
list SittingAvatars;
list GetValues(integer Index)
{
list Tmp = llParseString2List(llList2String(Positions, Index), [";"], []);
return [(vector)llList2String(Tmp, 0), (rotation)llList2String(Tmp, 1)];
}
list FindFreePlace()
{
key Avatar = NULL_KEY;
list TempSittingAvatars;
integer i;
integer LinkNum;
for (i = 0; i < llGetNumberOfPrims() + 2; ++i)
{
if (llGetAgentSize(llGetLinkKey(i)) != ZERO_VECTOR)
{TempSittingAvatars = TempSittingAvatars + [llGetLinkKey(i)];}
}
for (i = 0; i < llGetListLength(SittingAvatars); ++i)
{
if (llListFindList(TempSittingAvatars, [llList2Key(SittingAvatars, i)]) == -1)
{SittingAvatars = llListReplaceList(SittingAvatars, [NULL_KEY], i, i);}
}
for (i = 0; i < llGetListLength(TempSittingAvatars); ++i)
{
if (llListFindList(SittingAvatars, [llList2Key(TempSittingAvatars, i)]) == -1)
{Avatar = llList2Key(TempSittingAvatars, i);}
}
if (Avatar != NULL_KEY)
{
for (i = 0; i < llGetNumberOfPrims() + 2; ++i)
{
if (llGetLinkKey(i) == Avatar)
{LinkNum = i;}
}
for (i = 0; i < llGetListLength(SittingAvatars); ++i)
{
if (llList2Key(SittingAvatars, i) == NULL_KEY)
{
SittingAvatars = llListReplaceList(SittingAvatars, [Avatar], i, i);
return [i, LinkNum];
}
}
}
return [-1];
}
default
{
state_entry()
{
llSitTarget(llList2Vector(GetValues(0), 0), llList2Rot(GetValues(0), 1));
integer i;
for (i = 0; i < llGetListLength(Positions); ++i)
{SittingAvatars = SittingAvatars + [NULL_KEY];}
}
changed(integer Was)
{
if (Was & CHANGED_LINK)
{
list NewPos = FindFreePlace();
if (llList2Integer(NewPos, 0) > -1)
{
llSetLinkPrimitiveParamsFast(llList2Integer(NewPos, 1),
[PRIM_POSITION, llList2Vector(GetValues(llList2Integer(NewPos, 0)), 0) + <0, 0, 0.325>,
PRIM_ROTATION, llList2Rot(GetValues(llList2Integer(NewPos, 0)), 1) / llGetRot()]);
}
}
}
}