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