Script de porte LSL : toucher pour ouvrir, se referme seule
Script de porte LSL gratuit pour Second Life. Touchez pour ouvrir et fermer, la porte pivote sur ses gonds et se referme toute seule après quelques secondes. Sons facultatifs.
Un script de porte simple et fiable pour Second Life. Touchez la porte et elle s'ouvre en pivotant sur ses gonds ; touchez à nouveau pour la fermer, ou laissez-la se refermer toute seule après quelques secondes. Elle retient la position de la porte fermée à chaque ouverture, donc vous pouvez déplacer la porte plus tard et elle fonctionnera toujours.
// Touch Door with auto-close - free LSL script from WhatSL (https://whatsl.com/scripts/lsl-door-script)
// Free to use, change and put in your own creations, also ones you sell.
//
// Put this script in an upright door that is its own object (not linked to the house).
// The door's width must run along its X axis (the red arrow in the Edit window).
// Touch to open, touch again to close. It also closes by itself after AUTO_CLOSE seconds.
float OPEN_ANGLE = 90.0; // degrees to swing; use -90.0 to open the other way
float AUTO_CLOSE = 10.0; // seconds before it closes by itself; 0.0 = stay open
integer HINGE_SIDE = 1; // 1 = hinge on the +X edge, -1 = hinge on the -X edge
string OPEN_SOUND = ""; // optional: a sound name in the door's Contents, or a sound UUID
string CLOSE_SOUND = "";
integer gOpen = FALSE;
vector gClosedPos;
rotation gClosedRot;
openDoor()
{
// remember where the closed door is, so the door can be moved and still work
gClosedPos = llGetPos();
gClosedRot = llGetRot();
vector size = llGetScale();
vector hinge = gClosedPos + <HINGE_SIDE * size.x * 0.5, 0.0, 0.0> * gClosedRot;
rotation turn = llEuler2Rot(<0.0, 0.0, OPEN_ANGLE * DEG_TO_RAD>);
llSetLinkPrimitiveParamsFast(LINK_THIS, [
PRIM_POSITION, hinge + (gClosedPos - hinge) * turn,
PRIM_ROTATION, gClosedRot * turn
]);
if (OPEN_SOUND != "") llPlaySound(OPEN_SOUND, 1.0);
gOpen = TRUE;
if (AUTO_CLOSE > 0.0) llSetTimerEvent(AUTO_CLOSE);
}
closeDoor()
{
llSetTimerEvent(0.0);
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, gClosedPos, PRIM_ROTATION, gClosedRot]);
if (CLOSE_SOUND != "") llPlaySound(CLOSE_SOUND, 1.0);
gOpen = FALSE;
}
default
{
touch_start(integer total)
{
if (gOpen) closeDoor();
else openDoor();
}
timer()
{
closeDoor();
}
}
Libre d’utilisation, de modification et d’intégration dans vos créations, même celles que vous vendez.
Comment l'installer
- Créez ou rezzez votre porte. Elle doit être debout et être un objet à part entière, non lié à la maison.
- Vérifiez que la largeur de la porte suit son axe X (la flèche rouge dans la fenêtre Modifier). Sinon, faites pivoter la porte avec les outils de construction ou échangez les valeurs de taille.
- Ouvrez l'onglet Contenu, cliquez sur Nouveau script, collez le script et enregistrez.
- Touchez la porte. Si elle s'ouvre dans le mauvais sens, mettez OPEN_ANGLE à -90.0. Si elle tourne autour du mauvais bord, mettez HINGE_SIDE à -1.
Réglages
- OPEN_ANGLE : l'amplitude d'ouverture de la porte, en degrés.
- AUTO_CLOSE : nombre de secondes avant que la porte ne se referme toute seule ; 0.0 la laisse ouverte jusqu'à ce qu'on la touche.
- HINGE_SIDE : le bord vertical qui sert de gond.
- OPEN_SOUND / CLOSE_SOUND : le nom d'un son dans le Contenu de la porte, ou un UUID de son. Laissez vide pour un silence.
Astuces
- Pour une double porte, placez le script dans les deux portes et réglez l'une sur OPEN_ANGLE 90.0 et l'autre sur -90.0.
- Les portes faisant partie d'une maison liée demandent une autre méthode. La solution la plus simple consiste à délier la porte et à la garder comme objet indépendant.
Questions fréquentes
Pourquoi ma porte tourne-t-elle autour de son milieu ?
Le script fait pivoter la porte autour d'un bord qu'il calcule à partir de la taille X de la porte. Si la porte tourne autour du milieu, sa largeur n'est pas alignée sur l'axe X. Faites pivoter la porte pour que la flèche rouge suive sa largeur.
Puis-je verrouiller la porte ?
Cette version s'ouvre pour tout le monde. Pour une porte verrouillée, ajoutez une vérification au début de touch_start, par exemple : if (llDetectedKey(0) != llGetOwner()) return;
Le script provoque-t-il du lag ?
Non. Il ne s'exécute que lorsqu'on touche la porte et lorsque le minuteur la referme.