Script de porta LSL: toque para abrir, fecha sozinha
Script de porta LSL grátis para Second Life. Toque para abrir e fechar: a porta gira na dobradiça e se fecha sozinha após alguns segundos. Sons opcionais.
Um script de porta simples e confiável para Second Life. Toque na porta e ela abre girando na dobradiça; toque de novo para fechar, ou deixe que ela se feche sozinha após alguns segundos. Ela lembra a posição fechada da porta toda vez que abre, então você pode mover a porta depois e ela continua funcionando.
// 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();
}
}
Livre para usar, alterar e colocar nas suas criações, inclusive nas que você vende.
Como configurar
- Crie ou rezze sua porta. Ela precisa estar em pé e ser um objeto próprio, não linkado à casa.
- Confira se a largura da porta segue o eixo X (a seta vermelha na janela Editar). Se não seguir, gire a porta nas ferramentas de construção ou troque os valores de tamanho.
- Abra a aba Conteúdo, clique em New Script, cole o script e salve.
- Toque na porta. Se ela abrir para o lado errado, defina OPEN_ANGLE como -90.0. Se girar pela borda errada, defina HINGE_SIDE como -1.
Configurações
- OPEN_ANGLE: o quanto a porta gira, em graus.
- AUTO_CLOSE: segundos até a porta se fechar sozinha; 0.0 mantém a porta aberta até alguém tocar.
- HINGE_SIDE: qual borda vertical é a dobradiça.
- OPEN_SOUND / CLOSE_SOUND: o nome de um som no Conteúdo da porta, ou o UUID de um som. Deixe vazio para ficar sem som.
Dicas
- Para portas duplas, coloque o script nas duas portas e defina uma como OPEN_ANGLE 90.0 e a outra como -90.0.
- Portas que fazem parte de uma casa linkada precisam de outro método. A solução mais fácil é desfazer o link da porta e mantê-la como objeto próprio.
Perguntas frequentes
Por que minha porta gira pelo meio?
O script gira em torno de uma borda que ele calcula a partir do tamanho X da porta. Se a porta gira pelo meio, a largura dela não está no eixo X. Gire a porta para que a seta vermelha siga a largura dela.
Posso trancar a porta?
Esta versão abre para todo mundo. Para uma porta trancada, adicione uma verificação no início de touch_start, por exemplo: if (llDetectedKey(0) != llGetOwner()) return;
O script causa lag?
Não. Ele só roda quando alguém toca na porta e quando o timer a fecha.