This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Beifahrer Sitzscript für Fahrzeuge
#1
Universales Script für Sittargets.
Bietet Beifahrer Sitz für Fahrzeuge, einzelner Sitz für Sessel von Karussels und Schaukeln, etc

Das Script bietet sich immer dann an, wenn nur eine Animation abgespielt werden soll, und besonders wenn das Sittarget nicht das Rootprim ist.

Es gibt mehrere Möglichkeiten Sit Targets zu erzeugen. Darunter sehr komfortable und effiziente wie den PMAC Multiposer.

In Opensim ist das aber leider nicht mehr funtional sobald (mache) Fahrzeuge als "physical Object" bewegt werden.

Bis Version 0.8x konnte ich zum Beispiel noch den PMAC Multiposer in meine Boote einbauen, und alle Avas konnten auf dem einzigen Rootprim stitzen. Mit der 0.9 änderte sich auf einmal das verhalten. Sobald das Fahrzeug "physisch" war konnte sich kein weiterer Ava setzten, und es erschien der Fehler "no sit Target".

Dies zwang mich auf den komfortablem PMAC Poser in Booten zu verzichten.

Als Alternative dient nun das folgende Script:

Es wird pro Ava nun ein eigenes Prim im Linkset benötigt, und darin dieses Script eingefügt.
Bei den Booten habe ich einfach je Sitzplatz zusätzlich einen (unsichtbaren) Primwürfel hinzugefügt.


Script VARIANTE1: Animations Name muss manuell im Script eingetragen werden. ebenso muss die Sitzposition manuell eingetragen werden.
Code:
// P301 JetSki Beifahrer script
// Wird pro Beifahrer in eine eigenes SUB-Prim gesetzt.
// Diese Prim wird auf "auf Objekt sitzen" umgestellt
// CC0 by Tron


string      vorwaertsAnim = "Jetskbeifahrer";   // FahrerAnimation
vector      sitzposition = <0.0, 0.0, 0.250>;   // Sitzposition
key         kapitan;
string      animation;                       // aktuell gespielte Animation


init_followCam()
{
    llSetCameraParams([
                       CAMERA_ACTIVE, 1,                 // 0=INACTIVE  1=ACTIVE
                       CAMERA_BEHINDNESS_ANGLE, 2.5,     // (0 to 180) DEGREES
                       CAMERA_BEHINDNESS_LAG, 0.3,       // (0 to 3) SECONDS
                       CAMERA_DISTANCE, 3.0,             // ( 0.5 to 10) METERS
                       CAMERA_PITCH, 12.0,               // (-45 to 80) DEGREES
                       CAMERA_POSITION_LOCKED, FALSE,    // (TRUE or FALSE)
                       CAMERA_POSITION_LAG, 0.5,         // (0 to 3) SECONDS
                       CAMERA_POSITION_THRESHOLD, 0.0,   // (0 to 4) METERS
                       CAMERA_FOCUS_LOCKED, FALSE,       // (TRUE or FALSE)
                       CAMERA_FOCUS_LAG, 0.0,            // (0 to 3) SECONDS
                       CAMERA_FOCUS_THRESHOLD, 0.0,      // (0 to 4) METERS
                       CAMERA_FOCUS_OFFSET, <-3, 0, 1>   //  METERS
                      ]);
    llForceMouselook(FALSE);
}


default
{
    on_rez(integer param) { llResetScript();}


    state_entry()
    {
        llSetSitText( "Beifahrer" );
        vector SitTarget_Rot = llRot2Euler( llGetRootRotation() ); // SIT TARGET in Anhängigkeit von Fahrzeug Rotation
        llSitTarget(sitzposition, llEuler2Rot(DEG_TO_RAD * SitTarget_Rot)); 
    }


    changed(integer change)
    {
        if ((change & CHANGED_LINK) == CHANGED_LINK)
            {
                kapitan = llAvatarOnSitTarget();
                if (kapitan != NULL_KEY)
                    {
                        llRequestPermissions(kapitan, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA | PERMISSION_TRACK_CAMERA);
                    }
                else
                    { // Beifahrer hat Boot verlassen
                        llStopAnimation( animation );
                        llPushObject(kapitan, <3,3,21>, ZERO_VECTOR, FALSE);
                        llReleaseControls();
                        llClearCameraParams();
                        llSetCameraParams([CAMERA_ACTIVE, 0]);
                    }
             }

    }


    run_time_permissions(integer perm)
    {
        if (perm)
        {
            llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);
            init_followCam();
            llStopAnimation("sit");
            animation = vorwaertsAnim;  // aktuelle Animation merken
            llStartAnimation(animation);
        }
    }
}


UPDATE 08.2022. Ich habe das Script etwas komfortabler gemacht. Es wird nun automatisch die erste Animation des Prims verwendet.
Wichtig ist das Script zu resetten nachdem die richtige Animation im Prim eingefügt wurde.
Ich hätte das zwar mit einem automatischen Reset bei Änderung des Linkinhalts auch machen können, aber unter der Gefahr von Nebenwirkungen.

Script VARIANTE2: Animation wird durch das Script nun automatisch erkannt. Es muss nur die SitzPosition eingegeben werden.

Code:
// P301 Universales Beifahrer Script  Versionsstand 12.08.2022
// Wird pro Beifahrer in eine eigenes SUB-Prim gesetzt.
// Diese Prim wird auf "auf Objekt sitzen" umgestellt
// CC0 by Tron

string      sitztext = "Beifahrer" ;
string      animname;                           // FahrerAnimation wird automatisch ermittelt
vector      sitzposition = <0.0, 0.0, 0.250>;   // Sitzposition
key         beifahrer;
string      animation;                          // aktuell gespielte Animation


init_followCam()
{
    llSetCameraParams([
                       CAMERA_ACTIVE, 1,                 // 0=INACTIVE  1=ACTIVE
                       CAMERA_BEHINDNESS_ANGLE, 2.5,     // (0 to 180) DEGREES
                       CAMERA_BEHINDNESS_LAG, 0.3,       // (0 to 3) SECONDS
                       CAMERA_DISTANCE, 3.0,             // ( 0.5 to 10) METERS
                       CAMERA_PITCH, 12.0,               // (-45 to 80) DEGREES
                       CAMERA_POSITION_LOCKED, FALSE,    // (TRUE or FALSE)
                       CAMERA_POSITION_LAG, 0.5,         // (0 to 3) SECONDS
                       CAMERA_POSITION_THRESHOLD, 0.0,   // (0 to 4) METERS
                       CAMERA_FOCUS_LOCKED, FALSE,       // (TRUE or FALSE)
                       CAMERA_FOCUS_LAG, 0.0,            // (0 to 3) SECONDS
                       CAMERA_FOCUS_THRESHOLD, 0.0,      // (0 to 4) METERS
                       CAMERA_FOCUS_OFFSET, <-3, 0, 1>   //  METERS
                      ]);
    llForceMouselook(FALSE);
}


default
{
    on_rez(integer param) { llResetScript();}


    state_entry()
    {
        animname = llGetInventoryName(INVENTORY_ANIMATION , 0);
        llSetSitText(sitztext);
        vector SitTarget_Rot = llRot2Euler( llGetRootRotation() ); // SIT TARGET in Anhängigkeit von Fahrzeug Rotation
        llSitTarget(sitzposition, llEuler2Rot(DEG_TO_RAD * SitTarget_Rot));
    }


    changed(integer change)
    {
        if ((change & CHANGED_LINK) == CHANGED_LINK)
            {
                beifahrer = llAvatarOnSitTarget();
                if (beifahrer != NULL_KEY)
                    {
                        llRequestPermissions(beifahrer, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS | PERMISSION_CONTROL_CAMERA | PERMISSION_TRACK_CAMERA);
                    }
                else
                    { // Beifahrer ist aufgestanden
                        llStopAnimation( animation );
                        llPushObject(beifahrer, <3,3,21>, ZERO_VECTOR, FALSE);
                        llReleaseControls();
                        llClearCameraParams();
                        llSetCameraParams([CAMERA_ACTIVE, 0]);
                    }
             }
    }


    run_time_permissions(integer perm)
    {
        if (perm)
        {
            llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_DOWN | CONTROL_UP | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT, TRUE, FALSE);
            init_followCam();
            llStopAnimation("sit");
            animation = animname;  // aktuelle Animation merken
            llStartAnimation(animation);
        }
    }
}


Stand 8.2022 ist mir ein Fehler in Firestorm 6.4.21.64531 aufgefallen:

Das Sittarget wird nicht mit "Stuhl" angezeigt sobald es 100% unsichtbar ist. Das ist ein Bug den es in älteren Versionen noch nicht gab.
Abhilfe ist das Sittarget mit einer Standard Textur zu belegen und nur 99% unsichtbar zu machen.
The following 4 users say Thank You to Tron Mcp for this post:
  • Coffeetime (08-22-2021), Lukas (08-22-2021), Maria Silberstein (08-22-2021), Sonnenschein (08-22-2021)
Zitieren
#2
UPDATE 12.08.2022

Ich habe das Scritpt etwas komfortabler gemacht.

Nun wird eine Animation die im selben Prim wie das Script liegt automatisch erkannt und verwendet.
Befinden sich mehrere Animationen im Prim wird immer die erste genommen.

Übrigens kann man das Script auch sehr gut für einfache Möbel einsetzten die nur eine Animation abspielen, wie zum Beispiel den Sitz einer bewegten Schaukel.
The following 1 user says Thank You to Tron Mcp for this post:
  • Lukas (10-11-2022)
Zitieren
#3
ERGÄNZENDE INFO 11.10.2022

Mir ist aufgefallen das die Scripting Engine "X-Engine" den folgenden Bug hat:
Wenn man ein Sit Target definiert darf nie ein ZERO Vector <0.0,0.0,0.0> als Position angegeben werden, sonst wird das Sittarget nicht erstellt.

Folge ist das der AVA dann irgendwo rumhängt, anstelle gezielt an der gewünschten Position zu sitzen.

Ein kleiner Offset wie im folgenden Beispiel reicht aber schon für die Funktion:

vector  sitzposition = <0.0, 0.0, 0.01>;

    state_entry()
    {
        sitzanimation = llGetInventoryName( INVENTORY_ANIMATION, 0);
        llSetSitText("setzt dich");
        vector gSitTarget_Rot = llRot2Euler( llGetRootRotation() );  // SIT TARGET in Anhängigkeit von Boot Rotation
        llSitTarget(sitzposition, llEuler2Rot(DEG_TO_RAD * gSitTarget_Rot));     
    }

Festgestellt habe ich das auf der Opensim Version 0.9.0.1, aber es können auch neuere Versionen betroffen sein.
The following 1 user says Thank You to Tron Mcp for this post:
  • Lukas (10-11-2022)
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste