• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Multi Sit Script für zwei Personen - Problem

Kila Shan

Moderatorin
Teammitglied
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*)

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]
 
Ich denk mal, die zwei smileys mit sonnenbrille gehören nich in´s skript, deswegen.*ggggg

/me trollt sich :weg
 
Das Script hab ich auch. Ich hab mich auch gewundert, was "zweite Person" bedeuten soll. Aber das ganze Ding ist chaotisch und unverständlich, auch weil es aus einem Kauderwelsch aus Französisch und Englisch besteht (naja einem geschenkten Gaul...).

Wäre es nicht besser, wenn du jede Person mit einem eigenen Script sitzen läßt? Also angenommen es ist eine Couch, dann käme jede Sitzposition in ein anderes Prim, zb. in je ein Kissen. Pro Kissen kannst du dann mehrere Posen einstellen, zb. für männliche/weibliche Avas, oder verschiedene Avagrößen.
 
Hm, also mir kommt das Script auch ein wenig chaotisch vor. Und ich denke, die Idee von Monalisa ist der bessere Weg. Ich habe hier ja mal ein Script für einen einfachen Poseball gepostet, das funktioniert auch in verlinkten Objekten und wäre, was die Animationen betrifft, ziemlich einfach zu modifizieren.
 
Zwischenbericht, es hat etwas länger gedauert, da ich keine Lust hatte, mich ständig damit zu befassen.

Ich habe es in verschiedene Prims gepackt, leider klappt es auch nicht, das zweite wird nie angesprochen und es werden keine Animationen ausgelöst.

Man kann scheinbar damit keinen zweiten Ava animieren, ich gebe auf. Für einen Ava ist es recht einfach zu bedienen.
 
meld dich mal bei mir ingame Kila, ich hab dir was das klappt : )

kannst aber auch bis zu 15 avas (ja natürlich auch mehr wers braucht ) auf einem Prim setzen lassen ohne Probs

gruss Raffa
 

Users who are viewing this thread

Zurück
Oben Unten