LSL kapı scripti: dokununca açılır, kendi kendine kapanır
Second Life için ücretsiz LSL kapı scripti. Dokununca açılıp kapanır, kapı menteşesi üzerinde döner ve birkaç saniye sonra kendiliğinden kapanır. Sesler isteğe bağlı.
Second Life için basit ve güvenilir bir kapı scripti. Kapıya dokunun, menteşesi üzerinde açılsın; tekrar dokunarak kapatın ya da birkaç saniye sonra kendiliğinden kapansın. Her açılışta kapının kapalıyken durduğu konumu hatırlar, bu yüzden kapıyı sonradan taşısanız bile çalışmaya devam eder.
// 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();
}
}
Ücretsizdir: kullanabilir, değiştirebilir ve sattıkların dahil kendi yapımlarına koyabilirsin.
Nasıl kurulur
- Kapınızı yapın ya da rez edin. Dik durmalı ve evle bağlantılı değil, kendi başına bir obje olmalı.
- Kapının genişliğinin X ekseni boyunca uzandığını kontrol edin (Düzenle penceresindeki kırmızı ok). Değilse, kapıyı yapım araçlarıyla döndürün ya da boyut değerlerini değiştirin.
- İçerik sekmesini açın, Yeni Script'e tıklayın, scripti yapıştırıp kaydedin.
- Kapıya dokunun. Ters yöne açılırsa OPEN_ANGLE değerini -90.0 yapın. Yanlış kenardan dönerse HINGE_SIDE değerini -1 yapın.
Ayarlar
- OPEN_ANGLE: Kapının derece cinsinden ne kadar açılacağı.
- AUTO_CLOSE: Kapının kendiliğinden kapanmadan önceki saniye sayısı; 0.0 olursa dokunulana kadar açık kalır.
- HINGE_SIDE: Hangi dikey kenarın menteşe olduğu.
- OPEN_SOUND / CLOSE_SOUND: Kapının İçeriğindeki bir sesin adı ya da bir ses UUID'si. Sessiz olması için boş bırakın.
İpuçları
- Çift kanatlı kapılarda scripti her iki kapıya koyun; birine OPEN_ANGLE 90.0, diğerine -90.0 yazın.
- Bağlı bir evin parçası olan kapılar için farklı bir yöntem gerekir. En kolay çözüm, kapıyı bağlantısını kesip kendi başına bir obje olarak tutmaktır.
Sık sorulan sorular
Kapım neden ortasından dönüyor?
Script, kapının X boyutundan hesapladığı bir kenarın etrafında döndürür. Kapı ortasından dönüyorsa genişliği X ekseni boyunca değildir. Kırmızı oku genişliği boyunca gelecek şekilde kapıyı döndürün.
Kapıyı kilitleyebilir miyim?
Bu sürüm herkes için açılır. Kilitli bir kapı için touch_start'ın başına bir kontrol ekleyin, örneğin: if (llDetectedKey(0) != llGetOwner()) return;
Script lag yapar mı?
Hayır. Yalnızca biri kapıya dokunduğunda ve zamanlayıcı kapıyı kapattığında çalışır.