• 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.

Pose Script fuer Baelle und Moebel

@ Nadinia Seid

Wenn ich mir jetzt 100%tig sicher gewesen waere, haette ich keinen test gemacht^^
Waere ja nicht das erste mal das wieder mal was geaendert worden ist.
Ich hatte es nur noch im Hinterkopf und meine letzten Tests dazu liegen schon etwas zureuck.
 
Was fuern Inventory soll denn ausgetauscht werden wenn man drauf sitzt und
wer ist schon so bloed und laesst sich von fremden Leuten Zeug in seinen Sessel stecken?

Halloooooooo, wir reden hier von einem popeligen Fullperm Posescript.

Jhary Priestly seine Change Erweiterung vom 22.08.09 hat durchaus seinen Sinn, den du allerdings nicht verstanden hast.
Es wird explizit auf die Veränderung "Inventory" des Prims geprüft (und dabei ist es Wumpe ob auf dem Teil einer sitzt oder nicht), dann lädt er lediglich die neue Animation, die auch jemand anderes als der Owner in das Teil reinziehen könnte. Allerdings weiß ich nicht, warum er damals auch auf
CHANGED_ALLOWED_DROP getestet hat.
Trotzdem kann und sollte man da noch etwas mehr coden, sonst hat man möglichweise gar keine Anim da drinnen und sein String ist "" (leer).
Oder man packt immer mehr rein, und bekommt trotzdem immer nur die Anim abgespielt, die eben in der Sortierreihenfolge oben steht.

Herm
 
Wie gesagt, es handelt sich um ein einfaches FULLPERM Posescript, bei dem jeder nach einlegen einer neuen Ani mal eben auf Reset klicken kann.
Das doch nun wirklich kein grosser Akt, dennoch wuerde ich niemals zulassen das jemand anderes ausser mir, zeug in meine Moebel steckt.
 
Daemonika hat tatsächlich Recht. on_rez wird beim Neustart ausgeführt, wenn es ein Attachment ist, nicht aber bei einem Objekt.

Immerhin - jetzt haben wir alle was gelernt - ist doch auch was Gutes. :)
 
@ Sylvie Munro

Also ich hab mir dein Script mal angesehen, es sieht ja wirklich fast genau so aus wie meins.
Das muss wohl dran liegen das dein Script gut is, bzw. nur genau das beinhaltet was wirklich noetig ist.
Wer weiss, vieleicht war es mal so das der on_rez beim SimNeustart ausgefuehrt wurde, aber das LL oefter mal was aendert ist ja kaum zu uebersehen, bei so viel durchgestrichenem kram in der Wiki.
Wo man deins uebrigens ja auch findet, was nicht jeder von sich behaupten kann.
Dabei habe ich dann festegestellt das du auch keinen Wert drauf gelegt hast, das dir jemand fremdes Zeug in deine Baelle/moebel legen kann. :mrgreen:

Da frag ich mich was an dem script sooooooo Falsch sein soll, wenn so viele deinem aehneln^^

Daemonika hat tatsächlich Recht. on_rez wird beim Neustart ausgeführt, wenn es ein Attachment ist, nicht aber bei einem Objekt.
Als Attachment?
Was hat sich Linden denn dabei gedacht?
Ich hab jedenfalls noch keinen SimNeustart ueberlebt wenn ich drauf geblieben bin. :grin:
Oder wie muss ich das verstehen?
 
Also ich hab mir dein Script mal angesehen, es sieht ja wirklich fast genau so aus wie meins.
Das muss wohl dran liegen das dein Script gut is, bzw. nur genau das beinhaltet was wirklich noetig ist.

Hm, was soll ich dazu sagen? Ich hatte es damals nicht umsonst "Simple low Lag Poseball Script" getauft. Zu der Zeit, als ich es postete, war das was Neues, weil optimiert. Viele andere Scripte zu der Zeit haben eine Menge mehr als überflüssiges Zeugs getan. Allerdings: Deine quasi Erweiterung macht es "rund". :)

Da frag ich mich was an dem script sooooooo Falsch sein soll, wenn so viele deinem aehneln^^

Öhm, ich hab' nie gasgat, dass da was falsch wäre. Ich war nur verblüfft, wegen der Ähnlichkeit, und ich denke, das verstehst Du jetzt. :)

Als Attachment?
Was hat sich Linden denn dabei gedacht?
Ich hab jedenfalls noch keinen SimNeustart ueberlebt wenn ich drauf geblieben bin.
Hm, ich schon... jedenfalls kam ich immer auf die entsprechende Sim zurück - was allerdings eine Einstellungssache im Viewer ist.
Fakt ist, dass ein Log off/Log in oder Sim-Neustart bei Attachments den on_rez auslöst (Sim-Neustart löst ja einen Log-In aus, wenn Du dort bist).

Dabei habe ich dann festegestellt das du auch keinen Wert drauf gelegt hast, das dir jemand fremdes Zeug in deine Baelle/moebel legen kann.
Aus gutem Grund ;)
 
Fakt ist, dass ein Log off/Log in oder Sim-Neustart bei Attachments den on_rez auslöst (Sim-Neustart löst ja einen Log-In aus, wenn Du dort bist).
Stimmt, jetzt wo du es sagst, faellt mir auch wieder ein das ich bei einem meiner Attachments genau darauf achten musste, das es deswegen NICHT resettet.
(Sonst waer mir ja immer wieder ein Script-Status floeten gegangen.)
(aber dasn anderes Thema. :wink:)

Nachtrag:
Irgendwie laesst mit das keine ruhe.
Als Attachment?
Was hat sich Linden denn dabei gedacht?
Warum soll ein Attachment resetten wenn man ON/OFF geht?
Ich sehe immer noch nicht wozu das gut sein soll.
Bei den meisten Attachments darf man doch dann alles wieder neu einstellen, viel lust haette ich dazu aber net.
 
Warum soll ein Attachment resetten wenn man ON/OFF geht?
Ich sehe immer noch nicht wozu das gut sein soll.
Manchmal hat das Vorteile, z.B. den, dass ein Attachment eben in einem genau definierten Zustand ist, wenn man online geht.

Das Speichern von Daten löse ich bei solchen Scripten dadurch, dass das Hauptscript bei einem Reset eine Anfrage an ein zweites Script sended, das daraufhin die Daten zurücksended.

Ist vielleicht nicht immer optimal so und hängt vom jeweiligen Script ab, ob's Sinn macht oder nicht.
 
Update

Diesmal nicht so bunt, dafuer aber das Update Rot markiert.
Seit Server version 1.38 ist es moeglich Hovertexte im llSetPrimitiveParams anzugeben und man kann einiges kombinieren.
Als ein weitere Update hab ich mich fuers
+ CHANGED_INVENTORY entschlossen, das script nervt dann net, wenn man verschiedene Anis probiert. ;)

Uebrigens der Operator | waere im scrit beim changed fatal, der changed wuerde immer ausgeloesst, egal bei welchen der 4 angegebenen events und das script wuerde dauernd resetten, ziemlich doof beim hinsetzen, das + zeichen unterscheidet dort besser.

Code:
string anim;
integer sitting;
[COLOR=Red]show()
{
    llSetPrimitiveParams([PRIM_TEXT,"SIT HERE",<0.9,0.6,0.2>,1.0, PRIM_COLOR, ALL_SIDES,<1,1,1>,1.0]);
}
hide()
{
    llSetPrimitiveParams([PRIM_TEXT,"",ZERO_VECTOR,0.0, PRIM_COLOR, ALL_SIDES,ZERO_VECTOR,0.0]);
}[/COLOR]
default
{
    state_entry()
    {
        show();
        sitting = 0;
        anim = llGetInventoryName(INVENTORY_ANIMATION, 0);
        llSitTarget(<-0.1,0.1,-0.43>,llEuler2Rot(<00,-90,-90>*DEG_TO_RAD));
    }
    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
            sitting = 1;
            llStopAnimation("sit_generic");
            llStopAnimation("sit");
            llStartAnimation(anim);
            hide();
        }
    }
    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {
            key avatar = llAvatarOnSitTarget();
            if (llKey2Name(avatar) != "")
            {
                llRequestPermissions(avatar, PERMISSION_TRIGGER_ANIMATION);
            }
            else
            {
                show();
                if ((llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) && sitting && llKey2Name(avatar) != "")
                {
                    llStopAnimation(anim);
                }
                sitting = 0;
            }
        }
        if (change & CHANGED_OWNER + CHANGED_REGION_START [COLOR=Red]+ CHANGED_INVENTORY[/COLOR])
        {
            llResetScript();
        }
    }
    on_rez(integer start_param)
    {
        llResetScript();
    }
}
PS: ich lass mir immer noch nix von fremden in meine Moebel legen. :p
 
!NEW! *DS* Single AO-Sit !NEW!

huhu,

soeben habe ich mein neuestes Posescript in der Wiki veroeffentlicht und wollte es hier auch niemanden vorenthalten.
Aufs anmalen hab ich diesmal verzichtet, war mir einfach zu viel.

Dieses Script kann mit und ohne AO genutzt werden, sogar ohne Animation im Object.
In beiden Faellen laesst sich die Sitzposition des Avatars einstellen und speichern.

*DS* Single AO-Sit (in Farbe)
Code:
/*/|/ 2010-09-01 15:25:38 lsl2 script

    ╔════════════════════════════════−−−−−−−−−→
    ║ *DS* Single AO-Sit by Daemonika Nightfire
    ╚═══════════════════−−−−−−→
    Dieses Posescript behandelt deinen Avatar wie einen Prim und ist dazu in der lage,
    die Avatarposition und Rotation in alle richtungen zu veraendern waerend der Avatar drauf sitzt.
    Es ist nicht zwingend notwendig eine Animation zusammen mit dem Script in das gewuenschte Object zu legen.
    Durch die verschiebe-moeglichkeit des Avatars kann es auch gemeinsam mit der eigenen AO genutzt werden.
    Die eingestellte Sit-Position wird im Script gespeichert und muss nicht jedesmal neu gesetzt werden.
    Zum speichern der Standart Sitzposition muss du dir mit den deaktivieren llOwnerSay im listener,
    die entsprechenen Werte ausgeben lassen und auf die "rotation saverot", "vector savepos" uebertragen.
    
    Wichtig!
    Das Posescript muss im Rootprim des Objects liegen.
    
    Script Time!
    Die Scriptzeit des Scripts liegt bei etwa 0.002 bis 0.005 ms.
    
*/

key avatar;
string anim;
integer inventory = FALSE;
integer sitting   = FALSE;

vector msgpos     = <0.0,0.0,0.43>; // setzt zugleich die Standart Position fuer den "llSitTarget".
vector msgrot     = <00,00,00>; // setzt zugleich die Standart Rotation fuer den "llSitTarget".

rotation saverot  = ZERO_ROTATION; // muss evtl. an "vector msgrot" angeglichen werden.
vector savepos    = <0.00000, 0.00000, 0.84999>; // gleicht die diferenz zwischen "llSitTarget" und "llSetLinkPrimitiveParamsFast" aus.

integer llPos = FALSE; // Diese beiden Luemmel sind noetig, weil der listener es lieber mag Position & Rotation getrennt voneinander einzustellen.
integer llRot = FALSE;

integer menu_handler;
integer menu_channel;
menu(key user,string title,list buttons) // diese Funktion ermoeglich x-beliebig viele Dialog-Varianten State-uebergreifend in einem script.
{
    llListenRemove(menu_handler); // entfehrnt sofort den vorherigen Listener
    menu_channel = (integer)(llFrand(999999.0) * -1); // Dynamischer Channel von -999999.0 bis 999999.0
    menu_handler = llListen(menu_channel,"","",""); // startet einen neuen Listener mit neuem Channel
    llDialog(user,title,buttons,menu_channel);
    llSetTimerEvent(30); // setzt die Zeit in Secunden, wie lange der Listener aktiv ist
}

default
{
    state_entry()
    {
        if(llGetInventoryNumber(INVENTORY_ANIMATION) > 0) // checkt das Objectinventar nach Animationen
        {
            anim = llGetInventoryName(INVENTORY_ANIMATION, 0);
            inventory = TRUE; // setzt einen Wahrheitsstatus wenn eine Animation gefunden wurde
        }
        llSitTarget(msgpos,llEuler2Rot(msgrot*DEG_TO_RAD));
        llOwnerSay((string)llGetFreeMemory() + " KiB free memory."); // reine Neugier, [07:04]  *DS* Single AO-Sit: 52314 KiB free memory.
    }
    touch_start(integer num_detected) 
    {
        if(llDetectedKey(0) == avatar && sitting) // durch diesen Status kann das Menue nur vom drauf sitzenden Avatar aufgerufen werden
        {
            menu(avatar,"\nSet your Position & Rotation.\nThe buttons x,y,z use Global orientation.\nThe other, from the perspective of the Avatar.",
            ["back","down","for","left","up","right","-x","-y","-z","+x","+y","+z"]);
        }
    }
    listen(integer channel,string name,key id,string msg) 
    {
        if(channel == menu_channel && sitting)
        {
            integer i;
            for(i = 0; i <= llGetNumberOfPrims(); i++)
            {
                if(llGetLinkName(i) == llKey2Name(avatar)) // findet im Linkset den Avatar als zusaetzlichen Prim
                {
                    list pos = llGetLinkPrimitiveParams(i,[PRIM_POSITION,PRIM_ROTATION]);
                    vector newpos = llList2Vector(pos, 0);
                    rotation newrot = llList2Rot(pos, 1);
                    
                    if(msg == "up")   {llPos = TRUE; msgpos = <0,0,0.05>;}
                    if(msg == "down") {llPos = TRUE; msgpos = <0,0,-0.05>;}
                    if(msg == "left") {llPos = TRUE; msgpos = <0,0.05,0>;}
                    if(msg == "right"){llPos = TRUE; msgpos = <0,-0.05,0>;}
                    if(msg == "for")  {llPos = TRUE; msgpos = <0.05,0,0>;}
                    if(msg == "back") {llPos = TRUE; msgpos = <-0.05,0,0>;}
                    
                    if(msg == "+z")   {llRot = TRUE; msgrot = <0,0,5>;}
                    if(msg == "-z")   {llRot = TRUE; msgrot = <0,0,-5>;}
                    if(msg == "+y")   {llRot = TRUE; msgrot = <0,5,0>;}
                    if(msg == "-y")   {llRot = TRUE; msgrot = <0,-5,0>;}
                    if(msg == "+x")   {llRot = TRUE; msgrot = <5,0,0>;}
                    if(msg == "-x")   {llRot = TRUE; msgrot = <-5,0,0>;}
                    
                    if(llRot)
                    {
                        newrot = (newrot / llEuler2Rot(msgrot * DEG_TO_RAD)) / (llGetRootRotation() * llGetLocalRot()); // sehr boese
                        saverot = newrot;
                        llRot = FALSE;
                        
                        // dieses "llOwnerSay" ist hilfreich beim einstellen der Globalen Werte, kann anschliessend deaktiviert werden
                        //llOwnerSay("Avatar Rotation " + (string)saverot);
                    }
                    if(llPos)
                    {
                        newpos = (newpos - llGetRootPosition()) / llGetRootRotation() + msgpos; // nicht ganz so boese
                        savepos = newpos;
                        llPos = FALSE;
                        
                        // dieses "llOwnerSay" ist hilfreich beim einstellen der Globalen Werte, kann anschliessend deaktiviert werden
                        //llOwnerSay("Avatar Position " + (string)savepos);
                    }
                    llSetLinkPrimitiveParamsFast(i,[PRIM_POSITION,savepos,PRIM_ROTATION,saverot]); // bewegt den zusaetzlichen Prim
                }
            }
            menu(id,"\nSet your Position & Rotation.\nThe buttons x,y,z use Global orientation.\nThe other, from the perspective of the Avatar.",
            ["back","down","for","left","up","right","-x","-y","-z","+x","+y","+z"]);
        }
    }
    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            avatar = llAvatarOnSitTarget();
            if (llKey2Name(avatar) != "")
            {
                integer av;
                for(av = 0; av <= llGetNumberOfPrims(); av++)
                {
                    if(llGetLinkName(av) == llKey2Name(avatar)) // findet im Linkset den Avatar als zusaetzlichen Prim
                    {
                        llSetLinkPrimitiveParamsFast(av,[PRIM_POSITION,savepos,PRIM_ROTATION,saverot]); // bewegt den zusaetzlichen Prim
                        if(inventory) // Abfrage des Wahrheitsstatus nach forhandener Animation
                        {
                            llRequestPermissions(avatar, PERMISSION_TRIGGER_ANIMATION); // wird erst bei forhandener Animation ausgefuehrt 
                        }
                        llInstantMessage(avatar,"Touch me to adjust your sit-position.");
                    }
                }
                sitting = TRUE;
            }
            else
            {
                if((llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) && sitting && llKey2Name(avatar) != "")
                {
                    if(inventory) // Abfrage des Wahrheitsstatus nach forhandener Animation
                    {
                        llStopAnimation(anim); // wird erst bei forhandener Animation ausgefuehrt 
                    }
                }
                sitting = FALSE;
            }
        }
        if(change & CHANGED_OWNER + CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    run_time_permissions(integer perm) // wird erst bei forhandener Animation ausgefuehrt 
    {
        if(perm & PERMISSION_TRIGGER_ANIMATION)
        {
            llStopAnimation("sit_generic");
            llStopAnimation("sit");
            llStartAnimation(anim);
        }
    }
    timer()
    {
        llSetTimerEvent(0);
        llListenRemove(menu_handler);
    }
    on_rez(integer start_param)
    {
        llResetScript();
    }
}
Mit der Rotationsberechnugn bin ich persoenlich noch nicht ganz zufrieden, aber es funktioniert.
Mir missfaellt halt das die Rotation sich an die Globalen Himmelsrichtungen orientiert und nicht ausschliesslich an das Object.

Ueber konstruktive verbesserungsvorschlaege bezueglich der Rotationsberechnung wuerde ich mich daher freuhen.
Bitte nur getestete ergebnisse, da wir ja alle wissen das uns SL oftmals mehr als nur einen Strich durch die Rechnung macht.

An dieser Stelle moechte ich mich noch bei Belial Dirval bedanken, der alte Meckerfritze stellt mich auch jedesmal vor eine neue Herausforderung mit seinem gemoser.

LG
Dae
 
Du meinst das?
Code:
newrot = (newrot / llEuler2Rot(msgrot * DEG_TO_RAD)) / (llGetRootRotation() * llGetLocalRot()); // sehr boese

Hab ich heute mit gekämpft den Links ne lokale Rotation beizubringen.

Bei mir funktionierte das hier:
Code:
rot = rot/llGetRootRotation() * llEuler2Rot(<0,-PI/2,0>)

Das soll wohl aber alles ziemlich böse sein. und vor allem nicht Allgemeingültig? Ich hab bei meiner heutigen Recherge jedenfalls immer nur die Hälfte verstanden. ;)
 
Naja bei mir war es ja auch nur das Ziel die Position, Größe unde eben die Rotation von Child A auf Child B zu übertragen.
Hintergrund sind sculptie planen bzw zyinder welche nur einseitig sind und deshalb den selben Prim nochmal nach außen gekehrt benötigen um besser auszusehen. Beim Anpassen sollte dann wenn man Child A skaliert, bewegt oder rotiert, Child B mitgezogen werden.
Das Problem war dabei das Child B immer um 90 Grad anders gedreht wurde als Child A.
Meine Lösung dreht es einfach nur wieder zurück.
 
Code:
        rotation newrot = llList2Rot(llGetLinkPrimitiveParams(2 , [PRIM_ROTATION]) , 0);
        newrot = newrot/llGetRootRotation();
        newrot = newrot*llEuler2Rot(<0 , 0 , 45.0>*DEG_TO_RAD);
        llSetLinkPrimitiveParams(2 , [PRIM_ROTATION , newrot/llGetRootRotation()]);

Evtl. hilft dir das weiter, müsstest du dann oben nur mal einfummeln.

(Anmerkung der Child-Prim 2 ist hier der Avatar, habs nur mit einem Root getestet)

Gruß Simon
 
Uebrigens der Operator | waere im scrit beim changed fatal, der changed wuerde immer ausgeloesst, egal bei welchen der 4 angegebenen events und das script wuerde dauernd resetten, ziemlich doof beim hinsetzen, das + zeichen unterscheidet dort besser.

Und...

if (change & CHANGED_OWNER + CHANGED_REGION_START + CHANGED_INVENTORY)

Ich bin erstaunt das das Plus funktioniert, aber die Pipe | funktioniert einwandfrei... sofern man auch klammern setzt.

Code:
if (change & [COLOR="Red"]([/COLOR] CHANGED_OWNER | CHANGED_REGION_START | CHANGED_INVENTORY [COLOR="red"])[/COLOR] )

Gruß Simon
 
@ Simon

Danke fuer den Hinweis.

So gesehen ist ja beides richtig.
Changed Konstanden sind ja integer und koennen durchaus addiert werden.

Macht natuerlich nicht generell bei allem Sinn, man sollte schon wissen was man addiert bzw. welche integer alle das selbe tun sollen.

PS: Deine Rotationsvariante habsch leider noch nicht geschafft zu probieren, werd ich aber noch nachholen.

LG
Dae
 
Code:
        rotation newrot = llList2Rot(llGetLinkPrimitiveParams(2 , [PRIM_ROTATION]) , 0);
        newrot = newrot/llGetRootRotation();
        newrot = newrot*llEuler2Rot(<0 , 0 , 45.0>*DEG_TO_RAD);
        llSetLinkPrimitiveParams(2 , [PRIM_ROTATION , newrot/llGetRootRotation()]);
Evtl. hilft dir das weiter, müsstest du dann oben nur mal einfummeln.

(Anmerkung der Child-Prim 2 ist hier der Avatar, habs nur mit einem Root getestet)

Gruß Simon

Eben getestet, fuert aber leider auch nicht zum erfolg.
Es verschlimmert es sogar noch.

Meine Ursprungsversion funktioniert ja im grossen ganzen.
Ich habe nur das Problem das die Rotation sich mit dem llSitTarget beisst.
Solange man das Object nicht bewegt nachdem man es auf seinen Ava eingestellt hat, funzt alles Prima.
Problematisch wirds erst sobald man die Rotation des Objects veraendert, dann muss man ihn resetten und neu einstellen.
Danach funzt wieder alles Prima.

Also steckt irgendwo zwischen nach saverot und erneutem llSitTarget der wurm drin und ich find den net.

LG
Dae
 
!NEW! *DS* Single AO-Sit !UPDATE!

Hmmmm...
...bin mir nicht zu 100% sicher, aber es sieht so aus als ob ichs hinbekommen habe das die rotation erhalten bleibt auch wenn man das Object bewegt (rotation).

Hat jemand lust zu pruefen ob ich meine Hausaufgaben richtig gemacht habe? :wink:

hier noch mal das ganze script mit den aenderungen (rot).
Code:
/*/|/ 2010-09-01 15:25:38 lsl2 script

    ╔════════════════════════════════−−−−−−−−−→
    ║ *DS* Single AO-Sit by Daemonika Nightfire
    ╚═══════════════════−−−−−−−−−→
    Dieses Posescript behandelt deinen Avatar wie einen Prim und ist dazu in der lage,
    die Avatarposition und Rotation in alle richtungen zu veraendern waerend der Avatar drauf sitzt.
    Es ist nicht zwingend notwendig eine Animation zusammen mit dem Script in das gewuenschte Object zu legen.
    Durch die verschiebe-moeglichkeit des Avatars kann es auch gemeinsam mit der eigenen AO genutzt werden.
    Die eingestellte Sit-Position wird im Script gespeichert und muss nicht jedesmal neu gesetzt werden.
    Zum speichern der Standart Sitzposition muss du dir mit den deaktivieren llOwnerSay im listener,
    die entsprechenen Werte ausgeben lassen und auf die "rotation saverot", "vector savepos" uebertragen.
    
    Wichtig!
    Das Posescript muss im Rootprim des Objects liegen.
    
    Script Time!
    Die Scriptzeit des Scripts liegt bei etwa 0.002 bis 0.005 ms.
    
*/

key avatar;
string anim;
integer inventory = FALSE;
integer sitting   = FALSE;

vector msgpos     = <0.0,0.0,0.43>; // setzt zugleich die Standart Position fuer den "llSitTarget".
vector msgrot     = <00,00,00>; // setzt zugleich die Standart Rotation fuer den "llSitTarget".
[COLOR=Red]vector targetrot  = <00,00,00>;[/COLOR]

rotation saverot  = ZERO_ROTATION; // muss evtl. an "vector msgrot" angeglichen werden.
vector savepos    = <0.00000, 0.00000, 0.84999>; // gleicht die diferenz zwischen "llSitTarget" und "llSetLinkPrimitiveParamsFast" aus.

integer llPos = FALSE; // Diese beiden Luemmel sind noetig, weil der listener es lieber mag Position & Rotation getrennt voneinander einzustellen.
integer llRot = FALSE;

integer menu_handler;
integer menu_channel;
menu(key user,string title,list buttons) // diese Funktion ermoeglich x-beliebig viele Dialog-Varianten State-uebergreifend in einem script.
{
    llListenRemove(menu_handler); // entfehrnt sofort den vorherigen Listener
    menu_channel = (integer)(llFrand(999999.0) * -1); // Dynamischer Channel von -999999.0 bis 999999.0
    menu_handler = llListen(menu_channel,"","",""); // startet einen neuen Listener mit neuem Channel
    llDialog(user,title,buttons,menu_channel);
    llSetTimerEvent(30); // setzt die Zeit in Secunden, wie lange der Listener aktiv ist
}

default
{
    state_entry()
    {
        if(llGetInventoryNumber(INVENTORY_ANIMATION) > 0) // checkt das Objectinventar nach Animationen
        {
            anim = llGetInventoryName(INVENTORY_ANIMATION, 0);
            inventory = TRUE; // setzt einen Wahrheitsstatus wenn eine Animation gefunden wurde
        }
        llSitTarget(msgpos,llEuler2Rot([COLOR=Red]targetrot[/COLOR]*DEG_TO_RAD));
        llOwnerSay((string)llGetFreeMemory() + " KiB free memory."); // reine Neugier, [07:04]  *DS* Single AO-Sit: 52314 KiB free memory.
    }
    touch_start(integer num_detected) 
    {
        if(llDetectedKey(0) == avatar && sitting) // durch diesen Status kann das Menue nur vom drauf sitzenden Avatar aufgerufen werden
        {
            menu(avatar,"\nSet your Position & Rotation.\nThe buttons x,y,z use Global orientation.\nThe other, from the perspective of the Avatar.",
            ["back","down","for","left","up","right","-x","-y","-z","+x","+y","+z"]);
        }
    }
    listen(integer channel,string name,key id,string msg) 
    {
        if(channel == menu_channel && sitting)
        {
            integer i;
            for(i = 0; i <= llGetNumberOfPrims(); i++)
            {
                if(llGetLinkName(i) == llKey2Name(avatar)) // findet im Linkset den Avatar als zusaetzlichen Prim
                {
                    list pos = llGetLinkPrimitiveParams(i,[PRIM_POSITION,PRIM_ROTATION]);
                    vector newpos = llList2Vector(pos, 0);
                    rotation newrot = llList2Rot(pos, 1);
                    
                    if(msg == "up")   {llPos = TRUE; msgpos = <0,0,0.05>;}
                    if(msg == "down") {llPos = TRUE; msgpos = <0,0,-0.05>;}
                    if(msg == "left") {llPos = TRUE; msgpos = <0,0.05,0>;}
                    if(msg == "right"){llPos = TRUE; msgpos = <0,-0.05,0>;}
                    if(msg == "for")  {llPos = TRUE; msgpos = <0.05,0,0>;}
                    if(msg == "back") {llPos = TRUE; msgpos = <-0.05,0,0>;}
                    
                    if(msg == "+z")   {llRot = TRUE; msgrot = <0,0,5>;}
                    if(msg == "-z")   {llRot = TRUE; msgrot = <0,0,-5>;}
                    if(msg == "+y")   {llRot = TRUE; msgrot = <0,5,0>;}
                    if(msg == "-y")   {llRot = TRUE; msgrot = <0,-5,0>;}
                    if(msg == "+x")   {llRot = TRUE; msgrot = <5,0,0>;}
                    if(msg == "-x")   {llRot = TRUE; msgrot = <-5,0,0>;}
                    
                    if(llRot)
                    {
                        newrot = (newrot / llEuler2Rot(msgrot * DEG_TO_RAD)) / (llGetRootRotation() * llGetLocalRot()); // sehr boese
                        saverot = newrot;
                        llRot = FALSE;
                        
                        // dieses "llOwnerSay" ist hilfreich beim einstellen der Globalen Werte, kann anschliessend deaktiviert werden
                        //llOwnerSay("Avatar Rotation " + (string)(saverot/llGetRootRotation()));
                    }
                    if(llPos)
                    {
                        newpos = (newpos - llGetRootPosition()) / llGetRootRotation() + msgpos; // nicht ganz so boese
                        savepos = newpos;
                        llPos = FALSE;
                        
                        // dieses "llOwnerSay" ist hilfreich beim einstellen der Globalen Werte, kann anschliessend deaktiviert werden
                        //llOwnerSay("Avatar Position " + (string)savepos);
                    }
                    llSetLinkPrimitiveParamsFast(i,[PRIM_POSITION,savepos,PRIM_ROTATION,saverot]); // bewegt den zusaetzlichen Prim
                }
            }
            menu(id,"\nSet your Position & Rotation.\nThe buttons x,y,z use Global orientation.\nThe other, from the perspective of the Avatar.",
            ["back","down","for","left","up","right","-x","-y","-z","+x","+y","+z"]);
        }
    }
    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            avatar = llAvatarOnSitTarget();
            if (llKey2Name(avatar) != "")
            {
                integer av;
                for(av = 0; av <= llGetNumberOfPrims(); av++)
                {
                    if(llGetLinkName(av) == llKey2Name(avatar)) // findet im Linkset den Avatar als zusaetzlichen Prim
                    {
                       [COLOR=Red] llSetLinkPrimitiveParamsFast(av,[PRIM_POSITION,savepos,PRIM_ROTATION,(saverot / llGetRootRotation() / llEuler2Rot(targetrot * DEG_TO_RAD / PI))]);[/COLOR] // bewegt den zusaetzlichen Prim
                        if(inventory) // Abfrage des Wahrheitsstatus nach forhandener Animation
                        {
                            llRequestPermissions(avatar, PERMISSION_TRIGGER_ANIMATION); // wird erst bei forhandener Animation ausgefuehrt 
                        }
                        llInstantMessage(avatar,"Touch me to adjust your sit-position.");
                    }
                }
                sitting = TRUE;
            }
            else
            {
                if((llGetPermissions() & PERMISSION_TRIGGER_ANIMATION) && sitting && llKey2Name(avatar) != "")
                {
                    if(inventory) // Abfrage des Wahrheitsstatus nach forhandener Animation
                    {
                        llStopAnimation(anim); // wird erst bei forhandener Animation ausgefuehrt 
                    }
                }
                sitting = FALSE;
            }
        }
        if(change & CHANGED_OWNER + CHANGED_INVENTORY)
        {
            llResetScript();
        }
    }
    run_time_permissions(integer perm) // wird erst bei forhandener Animation ausgefuehrt 
    {
        if(perm & PERMISSION_TRIGGER_ANIMATION)
        {
            llStopAnimation("sit_generic");
            llStopAnimation("sit");
            llStartAnimation(anim);
        }
    }
    timer()
    {
        llSetTimerEvent(0);
        llListenRemove(menu_handler);
    }
    on_rez(integer start_param)
    {
        llResetScript();
    }
}
Also so eine beknackte Umrechnung habe ich noch nie gesehen.
Jedenfalls musste ich den llSitTarget im changed mit einbeziehen.
Aber wie sagte mal jemand zu mir, "erlaubt ist, was geht" :mrgreen:

LG
Dae
 

Users who are viewing this thread

Zurück
Oben Unten