Ich benutze den Speedy Sitter GNU Version 0.5
Soweit so gut, für eine Person funktioniert er wunderbar. Nun wollte ich eine zweite Person damit animieren, laut beileigender NC soll es gehen, einfach eine zweite NC in content legen mit einem anderen Namen
1 Person :Configuration 0
2 Person :Configuration 1
Alles gemacht, trotzdem wird die zweite Person nicht animiert. Script ist schon resettet, die Prozedur habe ich auch schon zweimal gemacht, nun komme ich nicht weiter.
Was muss ich noch machen? Bitte Anfängerfreundlich erklären
Ich poste noch das Script (Achtung, recht lang *gg*)
Soweit so gut, für eine Person funktioniert er wunderbar. Nun wollte ich eine zweite Person damit animieren, laut beileigender NC soll es gehen, einfach eine zweite NC in content legen mit einem anderen Namen
1 Person :Configuration 0
2 Person :Configuration 1
Alles gemacht, trotzdem wird die zweite Person nicht animiert. Script ist schon resettet, die Prozedur habe ich auch schon zweimal gemacht, nun komme ich nicht weiter.
Was muss ich noch machen? Bitte Anfängerfreundlich erklären
Ich poste noch das Script (Achtung, recht lang *gg*)
Code:
[FONT=Fixedsys][SIZE=1]key ConfBall=NULL_KEY;
key who=NULL_KEY;
key confwho=NULL_KEY;
// Canaux de dialogue avec la balle.
integer canal;
integer handle;
string scriptName="....Speedy_Sit"; // DONT CHANGE
list lassise;
integer imynumber;
integer iNbScript;
string gName = "configuration"; // name of a notecard in the object's inventory
integer gLine = 0; // current line number
key gQueryID; // id used to identify dataserver queries
// Informations
list lsay=["en-us","\n(⇞PgUp or ⇟ PgDn ) change your pose. Touch for menu.","jp","\n タッチのポーズを変更することができます","fr","\n(⇞PgUp or ⇟PgDn ) change la pose. Toucher pour le menu.","ko","\n터치 메뉴","de","\nBerühren Sie die für das Menü"];
list lmsay=["en-us","\n Touch for menu.","jp","\n タッチのポーズを変更することができます","fr","\n Toucher pour le menu.","ko","\n터치 메뉴","de","\nBerühren Sie die für das Menü"];
list animations;
list aliasanimations;
list positions;
string oldanimation="sit";
string currentanimation="";
integer icurrentanimation=-1;
integer inbanimations=0;
integer idefaultanim=0;
integer menu=TRUE;
integer AutoSit=FALSE;
list GetSitTarget(integer prim, key av)
{//WARNING: llGetObjectDetails can introduce an error that goes as far as the 5th decimal place!
//This is highly unlikely to be ever noticed unless compounded over time.
//Do not use while moving (like in a moving vehicle)!!!
vector tp = llGetAgentSize(av);
if(tp)
{
if(prim == LINK_THIS)//llGetLinkKey doesn't like LINK_THIS
prim = llGetLinkNumber();
list details = [OBJECT_POS, OBJECT_ROT];
rotation f = llList2Rot(details = (llGetObjectDetails(llGetLinkKey(prim), details) + llGetObjectDetails(av, details)), 1);
rotation r = llList2Rot(details, 3) / f;
return [((llList2Vector(details, 2) - llList2Vector(details, 0)) / f) + (llRot2Up(r) * tp.z * 0.02638) - <0.0, 0.0, 0.4>, r];
}
return [];
}//Written by Strife Onizuka
UpdateSitTarget(vector pos, rotation rot)
{
llSitTarget(pos, rot);//Set the sit target
key user = who;
if(user)
{
vector size = llGetAgentSize(user);
if(size)
{
rotation localrot = ZERO_ROTATION;
vector localpos = ZERO_VECTOR;
if(llGetLinkNumber() > 1)
{
localrot = llGetLocalRot();
localpos = llGetLocalPos();
}
pos.z += 0.4;
integer linkNum = llGetNumberOfPrims();
do{
if(user == llGetLinkKey( linkNum ))
{
llSetLinkPrimitiveParams(linkNum,
[PRIM_POSITION, ((pos - (llRot2Up(rot) * size.z * 0.02638)) * localrot) + localpos,
PRIM_ROTATION, rot * localrot / llGetRootRotation()]);
jump end;
}
}while( --linkNum );
}
else
{
llUnSit(user);
}
}
// ARRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRGGGGGGGG !!!!!!!!!!!!!!!!!!!!!!!!!
// OMG !!!! Don't ask about it to my student !!!
@end;
}
startAnimation(string name )
{
llStopAnimation(oldanimation); // Stop the default animation
llSleep(0.05);
llStartAnimation(name); // and start the new one
vector temppos;
rotation temprot;
if (who != NULL_KEY) {
list templist=llParseString2List(llList2String(positions, icurrentanimation),["@"],[]);
temppos=(vector) llList2String(templist,0);
temprot=(rotation) llList2String(templist,1);
// llSay(0,(string) temppos+"-"+(string) temprot);
UpdateSitTarget(temppos,temprot);
}
currentanimation=name;
oldanimation=name;
if (who == NULL_KEY) {
if (name == "standup") menuanim ( confwho , 0 ,["<<"," ",">>"], animations);
else menuanim ( confwho , 0 ,["<<","save",">>"], animations);
}
}
stopAnimation(string name )
{
llStopAnimation(name); // Stop the animation
}
integer keytoint(string inkey)
{
return (integer)("0x" + llGetSubString(llMD5String(inkey,0), 0, 7));
}
loadanimation()
{
integer i;
inbanimations=llGetInventoryNumber(INVENTORY_ANIMATION);
animations=[];
for (i =0 ; i< llGetInventoryNumber(INVENTORY_ANIMATION); i++) {
animations=animations+[llGetInventoryName(INVENTORY_ANIMATION,i)];
}
}
loadposition()
{
positions=[];
integer i;
for (i=0; i < llGetListLength(animations) ; i++) positions=positions+["<0.0,0.0,0.010>@<0.0,0.0,0.0,1.0>"];
}
integer iPage=0;
menuanim ( key kUser, integer iAffichepage ,list button, list mymenu)
{
// LOCALISATION
string langue=llGetAgentLanguage( kUser );
list localize=["en-us","What do you want ?\n Pages:","fr","bla bli blo"];
// variable à charger dans l'init
integer iNObject=llGetListLength(mymenu);
integer iNbPage=(iNObject/9)+1;
// MENU DE COMMANDE
list lMenu=[];
integer x;
integer y;
if (iAffichepage == 0 ) iPage=1;
if (iAffichepage == 1000 ) iPage=iPage+1;
if (iAffichepage == -1000 ) iPage=iPage-1;
if (iPage > iNbPage ) iPage=1;
else if (iPage <= 0 ) iPage=iNbPage;
if (iPage == iNbPage) y=iNObject - ((iNbPage - 1 ) * 9); else y=9;
if (iNbPage == 1) lMenu=[" ",llList2String(button,1)," "];
else lMenu=[llList2String(button,0),llList2String(button,1),llList2String(button,2)];
for (x = 0; x < y ; x++) lMenu += [(string) (x + 1) +" "+llGetSubString(llList2String(mymenu, ((iPage - 1) * 9) + x), 0 , 8 )];
llDialog(kUser, "Que désirez vous? \n Page: " + (string) iPage +" / "+(string) iNbPage, lMenu, canal);
}
integer traitemenu ( key kUser, list button, list mymenu, string message)
{
integer iType=(integer) llGetSubString(message, 0, 0);
integer position;
position=llListFindList(button,[message]);
if (position != -1) {
if (position == 0) return -1000;
if (position == 2) return 1000;
if (position == 1) return -2;
}
if (iType != 0) return ( ((iPage - 1) * 9) + (iType - 1))+1;
return -1;
}
afficheconfiguration()
{
string objname=llGetObjectName();
llSetObjectName("");
integer i;
loadanimation();
llSay(0,"#CopierColler les lignes qui suivent dans une notecard qui devra s'appeller \""+gName+"\"");
llSay(0,"#Structure: ALIAS_NAME_POUR_LE_MENU@NOM_DE_L_ANIMATION_DANS_L_INVENTAIRE@POS@ROT");
for (i=0; i < llGetListLength(animations); i ++) llSay(0,"@Anims n° "+(string) i+"@"+llList2String(animations,i)+"@"+llList2String(positions,i));
llSetObjectName(objname);
}
openmenuuser(key id)
{
llListenRemove(handle);
canal=keytoint(id);
handle=llListen(canal,"",id,"");
llSetTimerEvent(30);
menuanim ( id , 0 ,["<<","standup",">>"], animations);
}
string localize (key id)
{
string sortie=llList2String(lsay,1);
if ( imynumber == 0 ){
integer found=llListFindList(lsay,[llGetAgentLanguage(id)]);
if (found != -1) sortie=llList2String(lsay,found+1);
}else {
sortie=llList2String(lmsay,1);
integer found=llListFindList(lmsay,[llGetAgentLanguage(id)]);
if (found != -1) sortie=llList2String(lmsay,found+1);
}
return sortie;
}
comptescript()
{
integer i;
lassise=[];
string myname=llGetScriptName();
if (myname == scriptName) imynumber=0;
else imynumber=(integer) llGetSubString(llGetScriptName(),llSubStringIndex(llGetScriptName(), " "),llStringLength(llGetScriptName()));
iNbScript=llGetInventoryNumber(INVENTORY_SCRIPT);
for (i=0; i < iNbScript ; i++) {
if (llGetSubString(llGetInventoryName(INVENTORY_SCRIPT,i),0,llStringLength(scriptName)-1) == scriptName) lassise=lassise+["FREE"];
}
}
list findavatar()
{
integer i;
list ltempavatar;
// llSay(0, (string) llGetNumberOfPrims());
// llSay(0, (string) llGetAgentSize(llGetLinkKey(i)));
for (i=1; i <= llGetNumberOfPrims(); i++)
{
if (llGetAgentSize(llGetLinkKey(i)) ) {
if (llListFindList(lassise,[(string) llGetLinkKey(i)]) == -1) return [1,llGetLinkKey(i)];
}
}
for (i=1; i <= llGetNumberOfPrims(); i++)
{
if (llGetAgentSize(llGetLinkKey(i)) ) ltempavatar=ltempavatar+[(string) llGetLinkKey(i)];
}
for (i=0; i < llGetListLength(lassise); i++)
{
if (llListFindList(ltempavatar,[llList2String(lassise,i)]) == -1) return [-1,llList2String(lassise,i)];
}
return [0,"VIDE"];
}
default
{
state_entry()
{
comptescript();
gName="configuration "+(string) imynumber;
llSitTarget(<0.0,0.0,0.1>,ZERO_ROTATION);
loadanimation();
if (llGetInventoryType(gName) == -1) state waitconfigure;
loadposition();
gLine=0;
gQueryID = llGetNotecardLine(gName, gLine);
llSetText("Wait i'm reading my conf",<1.0,0.0,0.0>,42);
}
on_rez (integer param)
{
llResetScript();
}
dataserver(key query_id, string data) {
if (query_id == gQueryID) {
if (data != EOF) {
if (llGetSubString(data,0,0) == ":") data=llGetSubString(data,2,-1);
data = llStringTrim(data, STRING_TRIM);
if (llGetSubString(data,0,0) != "#") {
list commande=llParseString2List(data,["@"],[]);
integer posianim=llListFindList(animations,[llList2String(commande,1)]);
if (posianim == -1) llOwnerSay("WARNING :"+llList2String(commande,1)+" is unknow");
else {
animations=llListReplaceList(animations,[llList2String(commande,0)],posianim,posianim);
positions=llListReplaceList(positions,[llList2String(commande,2)+"@"+llList2String(commande,3)],posianim,posianim);
if (llList2String(commande,0) == "default") idefaultanim=posianim;
}
}
++gLine;
gQueryID = llGetNotecardLine(gName, gLine); // request next line
}
llSetText("",<1.0,0.0,0.0>,42);
}
}
touch_start(integer number)
{
if (llDetectedKey(0) != who) return;
openmenuuser(llDetectedKey(0));
}
listen( integer channel, string name, key id, string message)
{
list commande=llParseString2List(message,["@"],[]);
integer verifymenu=traitemenu ( id , ["<<","standup",">>"], animations ,message);
if (verifymenu != -1) {
if (verifymenu == -2) {
llUnSit(id);
return;
}
if ((verifymenu == -1000) || (verifymenu == 1000) ) {
menuanim ( id, verifymenu ,["<<","save",">>"], animations);
return;
}
if (verifymenu >= 1) {
llListenRemove(handle);
icurrentanimation=verifymenu-1;
startAnimation(llGetInventoryName(INVENTORY_ANIMATION,verifymenu-1));
return;
}
}
}
changed(integer change)
{
if (change & CHANGED_INVENTORY || change & CHANGED_ALLOWED_DROP) {
if (llGetInventoryType(gName) == -1) llResetScript();
if (llGetInventoryNumber(INVENTORY_SCRIPT) != iNbScript) comptescript();
return;
}
if (change & CHANGED_LINK)
{
list lfind=findavatar();
if (llGetInventoryNumber(INVENTORY_ANIMATION))
{
integer perm = llGetPermissions();
if (llList2Integer(lfind,0) == 1) {
if (llListFindList(lassise,["FREE"]) == imynumber) {
who = (key) llList2String(lfind,1);
llMessageLinked(LINK_SET,imynumber, (string) who,who);
llWhisper(0,localize (who));
llRequestPermissions(who, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS );
}
} else {
// si il vient de quitter
if (who == (key) llList2String(lfind,1)) {
llMessageLinked(LINK_SET,imynumber, "FREE",who);
if (perm & PERMISSION_TRIGGER_ANIMATION) stopAnimation(currentanimation);
if (who != NULL_KEY) llRequestPermissions(who,FALSE);
who=NULL_KEY;
oldanimation="sit";
llReleaseControls();
}
}
// integer perm = llGetPermissions();
// if (llAvatarOnSitTarget()!=NULL_KEY)
// {
//
// if (who != NULL_KEY) return;
// who = llAvatarOnSitTarget();
// llWhisper(0,localize (who));
// llRequestPermissions(who, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS );
// llMessageLinked(LINK_SET,imynumber, "OQP",who);
// }
// else
// {
// llMessageLinked(LINK_SET,imynumber, "FREE",who);
// if (perm & PERMISSION_TRIGGER_ANIMATION) stopAnimation(currentanimation);
// if (who != NULL_KEY) llRequestPermissions(who,FALSE);
// who=NULL_KEY;
// oldanimation="sit";
// llReleaseControls();
// }
}
}
}
link_message (integer sender, integer num, string str, key id)
{
lassise=llListReplaceList(lassise,[str],num,num);
// integer i;
// for (i=0; i < llGetListLength(lassise) ; i++) llSay(0,llList2String(lassise,i));
}
control(key id, integer held, integer change) {
if (id != who) return;
integer pressed = held & change;
integer down = held & ~change;
integer released = ~held & change;
integer inactive = ~held & ~change;
if (pressed & CONTROL_FWD ) {
openmenuuser(id);
return;
}
if (pressed & CONTROL_UP) icurrentanimation=icurrentanimation+1;
if (pressed & CONTROL_DOWN) icurrentanimation=icurrentanimation-1;
if (icurrentanimation >= inbanimations) icurrentanimation=0;
if (icurrentanimation < 0) icurrentanimation=inbanimations-1;
startAnimation(llGetInventoryName(INVENTORY_ANIMATION, icurrentanimation));
}
run_time_permissions(integer perm)
{
integer desired_controls =
CONTROL_FWD |
CONTROL_UP |
CONTROL_DOWN;
if (perm & PERMISSION_TRIGGER_ANIMATION) {
icurrentanimation=idefaultanim;
startAnimation(llGetInventoryName(INVENTORY_ANIMATION, idefaultanim));
}
if (perm & PERMISSION_TAKE_CONTROLS) {
llTakeControls(desired_controls, TRUE, FALSE);
}
}
}
state waitconfigure
{
state_entry()
{
loadposition();
}
touch_start(integer total_number)
{
llSensor("Configuration-Balle (DONT CHANGE THE NAME)", NULL_KEY, SCRIPTED, 10, PI);
}
sensor( integer num)
{
ConfBall=llDetectedKey(0);
if (num == 1) state configure;
else llOwnerSay("Too many configuration ball near me.");
ConfBall=NULL_KEY;
}
changed(integer change)
{
if (change & CHANGED_INVENTORY || change & CHANGED_ALLOWED_DROP) {
if (llGetInventoryType(gName) != -1) llResetScript();
if (llGetInventoryNumber(INVENTORY_ANIMATION) != inbanimations ) {
loadanimation();
loadposition();
}
}
}
}
state configure
{
state_entry()
{
llOwnerSay("MODE CONFIGURATION ON - Memroy Free:"+(string) llGetFreeMemory());
icurrentanimation=-1;
llListenRemove(handle);
canal=keytoint(ConfBall);
handle=llListen(canal,"",NULL_KEY,"");
llSetTimerEvent(1);
if (llGetLinkNumber ()<= 1) llWhisper(canal,"INIT@"+(string) llGetPos()+"@"+(string)llGetRot());
else llWhisper(canal,"INIT@"+(string) llGetPos()+"@"+(string)llGetLocalRot());
}
timer()
{
if (llKey2Name(ConfBall) != "Configuration-Balle (DONT CHANGE THE NAME)" ) {
llListenRemove(handle);
llOwnerSay("MODE CONFIGURATION OFF - Memroy Free:"+(string) llGetFreeMemory());
state default;
}
}
listen( integer channel, string name, key id, string message)
{
list commande=llParseString2List(message,["@"],[]);
integer verifymenu=traitemenu ( id , ["<<","save",">>"], animations ,message);
if (verifymenu != -1) {
if ((verifymenu == -1000) || (verifymenu == 1000) ) {
menuanim ( id, verifymenu ,["<<","save",">>"], animations);
return;
}
if (verifymenu >= 1) {
if (message == "--done--") return;
icurrentanimation=verifymenu-1;
startAnimation(llGetInventoryName(INVENTORY_ANIMATION,verifymenu-1));
return;
}
}
if (llList2String(commande,0) == "SIT") {
integer perm = llGetPermissions();
confwho=(key) llList2String(commande,1);
if ( (perm & PERMISSION_TRIGGER_ANIMATION) && (confwho == llGetPermissionsKey()) )
startAnimation("standup");
else llRequestPermissions( confwho , PERMISSION_TRIGGER_ANIMATION);
return;
}
if (llList2String(commande,0) == "UNSIT") {
llRequestPermissions( confwho , FALSE );
confwho=NULL_KEY;
oldanimation="sit";
stopAnimation(currentanimation);
afficheconfiguration();
llOwnerSay("MODE CONFIGURATION OFF - Memroy Free:"+(string) llGetFreeMemory());
state default;
return;
}
if (llList2String(commande,0) == "save") {
list temp=GetSitTarget(llGetLinkNumber(), confwho);
string stemp=llList2String(temp,0)+"@"+llList2String(temp,1);
positions=llListReplaceList(positions,[stemp],icurrentanimation,icurrentanimation);
animations=llListReplaceList(animations,["--done--"],icurrentanimation,icurrentanimation);
menuanim ( confwho , 0 ,["<<","save",">>"], animations);
return;
}
}
run_time_permissions(integer perm)
{
if (perm & PERMISSION_TRIGGER_ANIMATION)
startAnimation("standup");
}
}[/SIZE][/FONT]